{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CH07 SVM"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## EX 7.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-02-13T23:12:19.925283Z",
     "start_time": "2019-02-13T23:12:19.772366Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     fun: 0.2500000000000011\n",
      "     jac: array([0.50000001, 0.50000001, 0.        ])\n",
      " message: 'Optimization terminated successfully.'\n",
      "    nfev: 10\n",
      "     nit: 2\n",
      "    njev: 2\n",
      "  status: 0\n",
      " success: True\n",
      "       x: array([ 0.5,  0.5, -2. ])\n"
     ]
    }
   ],
   "source": [
    "from scipy import optimize\n",
    "fun = lambda x: ((x[0])**2 + (x[1])**2)/2\n",
    "cons = ({'type': 'ineq', 'fun': lambda x: 3*x[0] + 3 * x[1] + x[2] - 1},\n",
    "        {'type': 'ineq', 'fun': lambda x: 4*x[0] + 3 * x[1] + x[2] - 1},\n",
    "        {'type': 'ineq', 'fun': lambda x: -x[0] - x[1] - x[2] - 1})\n",
    "res = optimize.minimize(fun, (1, 1, 1), method='SLSQP', constraints=cons)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-02-13T23:12:21.016040Z",
     "start_time": "2019-02-13T23:12:19.928118Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAEOCAYAAABhOhcDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xm4VuP+x/H3t100KEOKyFHOOdJurp2UJIVkyPwzxJGhUMg8O+GYORzzKZlVhpIpxxwVSrtJ2TkdU04JOSJKir6/P+5nU9lbe+/WXut59vq8rmtf7drraX2v56rPs9b9Xfd9m7sjIiLpUi3pAkREJH4KfxGRFFL4i4ikkMJfRCSFFP4iIimk8BcRSaFYw9/MzjKz98xsjpmNMrOacZ5fRESC2MLfzLYFzgAK3L0lkAccGdf5RUTkV3EP+1QHaplZdaA28FnM5xcREWIMf3dfCNwEfAosAr5195fiOr+IiPyqelwnMrPNgQOBpsA3wBNmdoy7P7LGMQOAAQB16tTpsNNOO8VVnohIlTBt2rSv3L3B+o6LLfyBPYGP3X0xgJk9CXQBfgl/dx8GDAMoKCjwwsLCGMsTEcl9Zja/LMfFOeb/KbCLmdU2MwN6AnNjPL+IiGTEOeY/BRgNTAdmZ849LK7zi4jIr+Ic9sHdhwBD4jyniIj8lmb4ioikkMJfRCSFFP4iIimk8BcRSSGFv4hICin8RURSSOEvIpJCCn8RkRRS+IuIpJDCX0QkhRT+IiIppPAXEUkhhb+ISAop/EVEUkjhLyKSQgp/EZEUUviLiKSQwl9EJIViC38za2ZmM9f4WmpmZ8Z1fhER+VVse/i6+7+BtgBmlgcsBMbGdX4REflVUsM+PYEP3X1+QucXEUm1pML/SGBUQucWEUm92MPfzDYC+gBPlPCzAWZWaGaFixcvjrs0EZHUSOLKvzcw3d2/WPcH7j7M3QvcvaBBgwYJlCYikg5JhP9RaMhHRCRRsYa/mdUB9gKejPO8IiKyttge9QRw92VA/TjPKSIiv6UZviIiKaTwFxFJIYW/iEgKKfxFRFJI4S8ikkIKfxGRFFL4i4ikkMJfRCSFFP4iIimk8BcRSSGFv4hICin8RURSSOEvIpJCCn8RkRRS+IuIpJDCX0QkhRT+IiIppPAXEUkhhb+ISArFvYH7ZmY22szeN7O5ZtY5zvOLiEgQ6wbuwK3AC+5+mJltBNQu9Uj32IoSEUmb2K78zWxToBtwL4C7r3T3b0p9wXvvweuvx1OciEjKxDns0xRYDNxvZjPMbLiZ1VnzADMbYGaFZlb4888/wx57wMknw7ffxlimiEjVF2f4VwfaA3e7eztgGXDhmge4+zB3L3D3grxWreDcc2H4cGjRAp57LsZSRUSqtjjDfwGwwN2nZH4/mvBhULJq1eDGG+Htt2HzzeGAA+Doo2Hx4jhqFRGp0mILf3f/HPivmTXL/FFPoGi9L9x5Z5g2Da64AkaPhvx8GDVKDWERkQ0Q93P+pwMjzOxdoC1wTZletdFG8Ne/wowZ8Mc/hjuAPn1gwYLKrFVEpMqKNfzdfWZmTL+1ux/k7kvK9Re0aAFvvgk33wyvvhruAoYOhdWrK6liEZGqKfdm+OblwVlnwZw50LEjnHIK9OwJH3yQdGUiIjkj98K/2A47wCuvwD33wPTp0KoV3HQT/PRT0pWJiGS93A1/ADM46SQoKoK994bzzoMuXWD27KQrExHJarkd/sW23RaeegoefRQ++QTat4chQ+DHH5OuTEQkK1WN8IdwF3DEEeEu4Mgj4corw4fA5MlJVyYiknWqTvgX23JLePhhGDcOli4Nw0Bnnw3LliVdmYhI1qh64V9s333D4nCnnAK33BIawq++mnRVIiJZoeqGP0C9enDXXfDGG1C9Ouy5J/TvD9+UvpioiEgaVO3wL9atG8yaBeefD/fdFyaHPf100lWJiCQmHeEPUKsWXH89TJkCDRrAQQeFxvCXXyZdmYhI7NIT/sUKCqCwEK66CsaOhebN4ZFHtFCciKRK+sIfoEYNuOQSmDkTmjWDY4+F/faDTz9NujIRkVikM/yLNW8OEyfCrbeGpnCLFnD33VooTkSqvHSHP4SF4s44IywUt8suMHAgdO8O8+YlXZmISKVR+Bdr2hReeik8DTR7NrRpAzfcoIXiRKRKUvivyQyOPz4sEdG7N1xwAXTqFB4TFRGpQhT+JWnUCMaMgSeeCLuFFRTAZZdpoTgRqTIU/qUxg8MOg7lzoW/f8Gho27bw1ltJVyYissFiDX8z+8TMZpvZTDMrjPPcFbbFFvDAA/DCC7B8OXTtCoMHw/ffJ12ZiEiFJXHlv4e7t3X3ggTOXXG9eoUnggYNgttuCwvFvfxy0lWJiFSIhn3Ko25duP32MDdg443D7mEnnABLyrcPvYhI0uIOfwdeMrNpZjZg3R+a2QAzKzSzwsWLF8dcWjl07RpmB190ETz0UFgobuzYpKsSESmzuMO/q7u3B3oDg8ys25o/dPdh7l7g7gUNGjSIubRyqlkTrrkGpk6FrbeGQw6Bww+Hzz9PujIRkfWKNfzdfWHm1y+BscDOcZ6/UrRrB++8Ez4Inn023AU8+KAWihORrBZb+JtZHTOrW/w9sDcwJ67zV6oaNcIQ0MyZIfz79QuTxObPT7oyEZESxXnlvxUwycxmAe8A49z9hRjPX/l22gkmTAhN4UmTwkJxd9yhheJEJOvEFv7u/pG7t8l8tXD3q+M6d6yqVYPTTgv7B3ftCqefHnYS+/e/k65MROQXetSzsmy/PfzrX2GCWFFRWCju2mth1aqkKxMRUfhXKjM47rgQ/gccABdfDDvvDDNmJF2ZiKScwj8OW28dFokbMyY8CtqxY2gQr1iRdGUiklIK/zgdcki4C/jLX+C668JQ0KRJSVclIimk8I/b5puHDWNeeglWroTddgsN4u++S7oyEUkRhX9S9tor7Bh2xhlw113QsiW8+GLSVYlISij8k7TJJmHz+EmToHZt2Gef0CD++uukKxORKk7hnw26dAmzgy+9FEaOhObNYfRoLREhIpVG4Z8tNt4Y/vY3KCyE7bYLi8QdeigsWpR0ZSJSBSn8s02bNjB5Mlx/fZgklp8P99+vuwARiZTCPxtVrw7nnw+zZoUdw044IWwc8/HHSVcmIlWEwj+b7bgjvP56eBpo8uTwRNBtt8HPPyddmYjkOIV/tqtWDU49NSwUt/vuYfP43XaDuXOTrkxEcpjCP1f84Q8wbhw88gjMmwdt28JVV2mhOBGpEIV/LjGDvn3DEhEHHwyXXQYFBTBtWtKViUiOKXP4m1kDM/ujmdWozIKkDBo2hEcfhaeegsWLw0qhF1wAP/yQdGUikiPWG/5mdrKZPQxcDZwMPGBmd5lZ00qvTn7fgQeGu4ATToAbbgiPiU6YkHRVIpIDynLlP9Xdj3X3Ae5+vrv3Bc4DqldybVIWm20G99wDr7wCP/0UmsIDB8LSpUlXJiJZrCzhX9/M7jGzNgBmNsDdl7n7fypyQjPLM7MZZvZcRV4vpejZMywUd/bZMHRoeCz0+eeTrkpEslRZwv8EwpX+sWbWA2i7geccDOg5xcpQpw78/e/w1ltQty7stx8ceyx89VXSlYlIlilL+H/n7t+4+7nA3kDHip7MzBoD+wHD13vwZ5+pgVlRnTrB9OkwZEhoDOfnw2OPaYkIEflFWcJ/XPE37n4h8NAGnO8fwPnA6pJ+aGYDzKzQzApZtEgNzA2x8cZw+eXhQ2D77eHII+Ggg8KHqoikXlnCf60dRtz9dgAzq1meE5nZ/sCX7l7qQ+nuPszdC9y9gB13VAMzCq1awdtvw003hd3D8vNh+HDdBYikXFnC/1ozu9nMTjKzw8zsXDO7C+hQznPtCvQxs0+AR4EeZvZIqUfXrbt2A7NFCzUwK6p6dTjnnPB+tm0L/fvDnnvCRx8lXZmIJGS94e/uZwFXAYsIj3e+7u4D3f3N8pzI3S9y98bu3gQ4EnjN3Y/53Ret2cCsVy80MI85Rg3MivrTn+C118KHaWFheCLollu0UJxICpVphq+7f+3u44DOQPxrCazZwHzsMTUwN0S1ajBgQFgormfPcGe1664wZ07SlYlIjMq7ts9S4BkzqwNgZr3MrFx3AADu/rq771+uF6mBGa3GjeGZZ8K2kR9+CO3bwxVXwMqVSVcmIjEoV/i7+2XAKOD1TOifDVxYGYWVSg3M6JjBUUeFJSIOPzx8uHboAFOnJl2ZiFSycoW/mfUE+gPLgC2BM9x9YmUU9rvUwIxWgwYwYkS4E1iyBHbZBc49F5YvT7oyEakk5R32uQS4zN27A4cBj2Vm/SZDDcxoHXBA6AX07x8a7a1bh53ERKTKKe+wTw93n5T5fjbQm/AkUHJKamB26aIGZkVtuin8858wfnz4/R57wMknw7ffJluXiERqgzZzcfdFQM+IatkwazYwP/pIDcwN1b07vPtuGP4ZPjzMs3j22aSrEpGIbPBOXu6ePQvwqIEZrdq14cYbw+bxW2wBffrA0UeHDWREJKdVzW0c1cCMVseOoadyxRUwejQ0bx7usPSElUjOqprhX0wNzOhstBH89a8wY0ZotPftG+4EFixIujIRqYCqHf6gBmbUWrSAN9+Em2+GV18N8yyGDoXVJS7UKiJZquqHf7F1G5j5+WpgVlReHpx1VniiqmNHOOWU8KTVBx8kXZmIlFF6wh/WbmDWr68G5obaYYewd/Dw4WE4qFWrMPP6p5+SrkxE1iNd4V9MDczomMGJJ4YnrHr1gvPOg86dw12WiGStdIY/qIEZtW22gbFjw2qr8+eHR2yHDIEff0y6MhEpQXrDv5gamNExg//7P5g7N6y6euWVYbLd5MlJVyYi61D4gxqYUatfHx5+GMaNC9tvdukSlt1YtizpykQkQ+G/JjUwo7XvvmGexamnhgX3WrUKd1cikjiF/7rUwIxWvXpw553wxhthKe499wyT7r75JunKRFJN4V8aNTCj1a0bzJoFF1wA998feitPP510VSKpFVv4m1lNM3vHzGaZ2XtmdkVc564wNTCjVasWXHcdTJkCDRuGbTiPOAK++IJRo8J2DHl54ddRo5IutmS5UqfIerl7LF+AAZtkvq8BTAF2Ke34Dh06eNYZN869cWN3M/ezznL//vukK8pdK1e6X3WV+0Yb+YpNtvAzGzzsr7262leudH/tNfemTd1Hjky6yLWNHBnqeu01z+o6Jd2AQi9LJpfloKi/gNrAdKBTacdkZfi7u3/7rfvAgeGta9rU/ZVXkq4otxUV+YxancP72bu3+/z57h6CtUWLhGtbR4sWoa41ZWOdkm5lDf9Yx/zNLM/MZgJfAi+7+5R1fj7AzArNrHBxti65UFID86ST1MCsqObN6bhiIj/fchtMmBDmXdx9N127rGbu3KSLW9vcudC169p/1rUrWVenSFnEGv7u/rO7twUaAzubWct1fj7M3QvcvaBBgwZxllZ+azYwH3hADcwN0Cw/jwltTg/zLDp3hoEDWdaxO/vsMC/p0tbSvDlMmrT2n02aFP5cJNck8rSPu38DjAf2SeL8kfmdBqaU3SWXhKdrx3/chFXPvcjc8+/H3pvNM/Nbw/XXZ808i1/qHA+rVoVfTzwx/LlIzinL2FAUX0ADYLPM97WAicD+pR2ftWP+pVmjgelbbOH+8MPuq1cnXVXOGDkyjJ1XqxZ+ffLOz9wPPjj0Atq3d585M+kS3f23darZK9mGMo75Wzi28plZa+BBII9wx/G4u19Z2vEFBQVeWFgYS22Rmjs3XA6+/Tb07h02kvnDH5KuKneNGQODBsH//heG2C69FGrWTLoqkaxlZtPcvWB9x8U27OPu77p7O3dv7e4tfy/4c1rz5jBxItx6a2gKt2gBd92lheIq6tBDw2zrvn3h6quhXTt4662kqxLJeZrhWxny8uCMM8K6Np07hyvX7t1hXnY1MHPGFluEpvoLL8Dy5eERm8GD4fvvk65MJGcp/CtTkybw4othOYPZs8MG8lnUwMw5vXqFJ4IGDYLbbw9TbF96KemqRHKSwr+ymUG/fmHoYt994cILoVOn8JiolF/duiH4J0wIY/+9esHxx8OSJUlXJpJTFP5xadQInnwybBu5cCEUFITm5YoVSVeWm7p2hZkz4aKLwt4B+fnh/RWRMlH4x00NzOjUrAnXXANTp8LWW4f39rDD4PPPk65MJOsp/JOgBma02rWDd96Ba6+F554LdwEPPggxPcYskosU/klSAzM6NWqEfsqsWeHx2n79wjyL+fOTrkwkKyn8k6YGZrSaNQvzK+64A958M3wQ3HGH5lmIrEPhny3UwIxOtWrhbmrOnPC+nn56WIjv/feTrkwkayj8s4kamNHafnv417/C+H9REbRpE97fVauSrkwkcQr/bFTcwLzmGjUwN5QZ/OUvYc2lPn3CEpw77wwzZiRdmUiiFP7ZqkaNMAQ0c2YIfzUwN8xWW8ETT4ShtM8/h44dw/ureRaSUgr/bLfTTqEZrAZmNA4+OAwBHXdc2IuhTZvf7tAikgIK/1ygBma0Nt8c7r0XXn4ZVq6E3XaD006D775LujKR2Cj8c4kamNHac8+w4N7gwWHZ7ZYtw8Q7kRRQ+OcaNTCjtckm8I9/hCG1OnVCX+W448LmMSJVmMI/V6mBGa3OncMH6KWXwsiRock+erSesJIqS+Gf69TAjM7GG8Pf/gaFhbDddnD44WGuxaJFSVcmErnYwt/MtjOz8WZWZGbvmdnguM5d5amBGa02bWDyZLjhhtBjyc8PG/LoLkCqkDiv/H8CznH3fGAXYJCZ5cd4/qpPDczoVK8O550XFopr3RpOOAH23hs+/jjpykQiEecG7ovcfXrm+++AucC2pb7ghx9iqqyKUQMzWjvuCOPHw913w5Qp4QP11lvh55+TrkxkgyQy5m9mTYB2wJRSDyoqCg1MfQhUjBqY0alWDU45Bd57D3bfHc48MwytFRUlXZlIhcUe/ma2CTAGONPdl67zswFmVmhmhSvq1AkNzLZt1cCsKDUwo7XddjBuHDzyCMybF9ZguuoqzbOQnBRr+JtZDULwj3D336xX7O7D3L3A3Qtq7rSTGphRUQMzOmZhC86iIjjkELjssrAf87RpSVcmUi5xPu1jwL3AXHe/uUwvUgMzOmpgRqthQxg1Cp5+Gr76Kky0u+ACDVNKzojzyn9X4Figh5nNzHztu95XqYEZLTUwo9WnT+gFnHhiuLNq0yYsxCeS5eJ82meSu5u7t3b3tpmv58v8F6iBGR01MKO12WYwbBi8+mr4EN19dxg4EJYuXf9rRRKSWzN81cCMlhqY0erRA959F84+G4YODctvP1/26xuROOVW+Bdbt4HZvDncd5/uAipCDcxo1akDf/87vPUW1KsH++0HxxwT+gIiWSQ3wx/WbmC2aRPGXNXArDg1MKPVqRNMnw5DhsDjj4dhysce0wWKZI3cDf9iamBGSw3M6Gy8MVx+ebiLatIEjjwSDjoIPvss6cpEqkD4gxqYUVMDM1qtWsHbb8NNN4W5K/n5MHy47gIkUVUj/IupgRktNTCjk5cH55wT3s927aB//zCP5cMPk65MUqpqhT+ogRk1NTCj9ac/hTuqoUPDU2utWsHNN2uYUmJX9cK/mBqY0VIDMzrVqsGAAWGYsmfPcEfQpQvMmZN0ZZIiVTf8i63bwGzdGt54I+mqcpMamNFq3BieeSZcpHz0EbRvD1dcEdazEqlkVT/8Ye0G5urV0L07nHqqGpgVpQZmdMzCh+jcuWHS4uWXQ4cOMHVq0pVJFZeO8C+2ZgNz2DA1MDeEGpjR2nJLGDECnn0WliyBXXaBc8+F5cuTrkyqqHSFP6iBGTU1MKO1//5hmLJ///DvtHXrMI9FJGLpC/9iamBGRw3MaG26Kfzzn7+Gfo8ecPLJ8O23ydYlVUp6wx9Kb2AuXJh0ZblJDcxode8ehtXOOy/0VPLzw7CQSATSHf7FSmpg3nOP7gIqQg3MaNWuHZ5SmzIF6tcPT68dfTQsXpx0ZZLjFP7F1mxgtm8fhjF69lQDs6LUwIxWQUHoqVx5ZdjHonnzsK+FLlCkghT+61qzgTltmhqYG0oNzOhstFGYsT5jRvh32rdvuBNYsCDpyiQHKfxLogZmtNTAjFaLFmFb01tugddeC8OUQ4eGOSwiZRTnBu73mdmXZpY7CaoGZrSKG5jnnqsG5obKywur186eHZYuOeWU8KH6n/8kXZnkiDiv/B8A9onxfNEopYH54lVTadky/B9s2TJ8PkgZ1K4NN94YdmJTA3PD7bBDeEhh+HCYOTMMq910E/z0U9KVSZaLcwP3CcDXcZ0vcms0MJd/toQ9L9uF5/PPZcXXy7n9drjkEn0AlEvHjmpgRsUsrF1VVAS9eoVHQzt3DndZIqXQmH957b8/PRq+x+cH9OcPT/ydGu1bsQfjufdeuPrqpIvLMWpgRmubbWDs2DBp8dNPwyO2Q4bAjz8mXZlkoawKfzMbYGaFZla4OIuHAabO25SGYzINTDPo0YNuI09mYZEamBWiBmZ0zMLwZFERHHVUuLNq3z4Ms4msIavC392HuXuBuxc0aNAg6XJK1bw5TJrEWg3MavcN5/08NTArTA3MaNWvDw89FBYu/O678LTa2WfDsmVJVyZZIqvCP1dcckkYYh0/HlbVqM34fW/k4K0ns3EjNTA3mBqY0erdOzyifOqp4c6qVaswj0XE3WP5AkYBi4BVwALgxN87vkOHDp7NRo50b9HCvVq18OvIke7+44/uV17pXqOGe/367iNGuK9enXSpuWvhQvcDD3QH94IC91mzkq4ot73xhvuf/xzezxNPdF+yJOmKpBIAhV6WTC7LQUl8ZXv4/645c9w7dQpv7/77u//3v0lXlLtWr3Z//HH3hg3dq1d3/+tf3VesSLqq3LV8ufuFF7rn5bk3auT+1FNJVyQRK2v4a9inMqiBGR01MKNVqxZce21YKK5hw7CK7RFHwBdfJF2ZxEzhX1nUwIyWGpjRKl5p9eqr4amnwgXKI49onkWKKPwrmxqY0VIDMzo1asDFF4d/l82awbHHhp3tPv006cokBgr/OGgGZrTq1YM774Q33oDq1cPewSedBN98k3Rlual5c5g4EW67DSZMCMOWd92lYcoqTuEfJ83AjFa3bjBrFlxwATzwQBi6ePrppKvKTXl5cPrp4a6qc2cYNCjMY5k3L+nKpJIo/OOmBma0atWC665TAzMqTZrAiy/C/feHflXr1nD99RqmrIIU/klRAzNaamBGxwz69Qsr2e63H1x4IXTqFO6ypMpQ+CdNDczoqIEZra23hjFjwqqrCxeGrSQvvRRWrEi6MomAwj8bqIEZLTUwo3XooWGYsm/fcGfVrh289VbSVckGUvhnEzUwo6MGZrS22CL8m3zhBVi+HLp2hTPOgO+/T7oyqSCFf7ZRAzNaamBGq1ev8IF62mlwxx1hG7uXXkq6KqkAhX+2UgMzOmpgRqtu3TCkNnEi1KwZPhCOPx6WLEm6MikHhX82UwMzWmpgRmvXXcO/zYsvhocfDhcoTz6ZdFVSRgr/XKAGZrTUwIxOzZrhPSwshEaNwnt72GHw+edJVybrofDPFWpgRqukBubgwWpgVlTbtqFPde218Nxz4S7gwQc1TJnFFP65Rg3MaBU3MAcNgttvVwNzQ9SoEfops2aFu9N+/WCffeCTT5KuTEqg8M9FamBGq27dEPxqYEajWbMwZ+XOO8NwWsuW4f3VMGVWUfjnMjUwo6UGZnSqVYOBA8Nd1W67hTkB3brB++8nXZlkKPyrAjUwo6MGZrS23z6sX/XQQ+FOtU0buOYaWLUq6cpSL9bwN7N9zOzfZvaBmV0Y57mrPDUwo6UGZnTMwmPKRUVw4IFwySVhd7sZM5KuLNViC38zywPuBHoD+cBRZpYf1/lTQw3M6KiBGa2ttgp7WTz5ZLiT6tgRLroIfvgh6cpSKc4r/52BD9z9I3dfCTwKHBjj+dOjtAamngiqmJIamPffn3RVuevgg8NdQL9+YSmTtm31sEICzGO6jTWzw4B93P2kzO+PBTq5+2lrHDMAGJD5bUtgTizFbZgtga+SLqIMVGe0VGd0cqFGyJ06m7l73fUdVD2OSsrK3YcBwwDMrNDdCxIuab1UZ7RUZ7Ryoc5cqBFyq86yHBfnsM9CYLs1ft8482ciIhKzOMN/KvBnM2tqZhsBRwLPxHh+ERHJiG3Yx91/MrPTgBeBPOA+d3/vd14yLJ7KNpjqjJbqjFYu1JkLNUIVqzO2hq+IiGQPzfAVEUkhhb+ISAplZfjnwjIQZnafmX1pZlk9F8HMtjOz8WZWZGbvmdngpGsqiZnVNLN3zGxWps4rkq6pNGaWZ2YzzOy5pGspjZl9YmazzWxmWR/9S4KZbWZmo83sfTOba2adk65pXWbWLPM+Fn8tNbMzk66rJGZ2Vub/zxwzG2VmNUs9NtvG/DPLQMwD9gIWEJ4SOsrdixItbB1m1g34HnjI3VsmXU9pzKwR0Mjdp5tZXWAacFAWvp8G1HH3782sBjAJGOzukxMu7TfM7GygAKjn7vsnXU9JzOwToMDds3pSkpk9CEx09+GZpwBru/s3SddVmkw+LSRMUJ2fdD1rMrNtCf9v8t39BzN7HHje3R8o6fhsvPLPiWUg3H0C8HXSdayPuy9y9+mZ778D5gLbJlvVb3lQvApdjcxXdl2ZAGbWGNgPGJ50LbnOzDYFugH3Arj7ymwO/oyewIfZFvxrqA7UMrPqQG3gs9IOzMbw3xb47xq/X0AWhlUuMrMmQDtgSrKVlCwznDIT+BJ42d2zsc5/AOcD2b4ziQMvmdm0zLIp2agpsBi4PzOMNtzM6iRd1HocCYxKuoiSuPtC4CbgU2AR8K27l7qqYzaGv1QCM9sEGAOc6e5Lk66nJO7+s7u3Jcz+3tnMsmo4zcz2B75092lJ11IGXd29PWEV3UGZYcpsUx1oD9zt7u2AZUBW9vgAMsNSfYAnkq6lJGa2OWGUpCmwDVDHzI4p7fhsDH8tAxGxzBj6GGCEu2f91lSZW//xwD5J17KOXYE+mfH0R4EeZvZIsiWVLHMViLt/CYwlDKeJnj6jAAACdUlEQVRmmwXAgjXu8EYTPgyyVW9gurt/kXQhpdgT+NjdF7v7KuBJoEtpB2dj+GsZiAhlGqn3AnPd/eak6ymNmTUws80y39ciNPyzas8/d7/I3Ru7exPCv8vX3L3UK6ukmFmdTHOfzDDK3mThCrnu/jnwXzNrlvmjnkBWPYiwjqPI0iGfjE+BXcysdub/fU9Cj69EWbWqJ1RoGYhEmNkooDuwpZktAIa4+73JVlWiXYFjgdmZ8XSAi939+QRrKkkj4MHM0xTVgMfdPWsfpcxyWwFjw/9/qgMj3f2FZEsq1enAiMyF3kfA8QnXU6LMh+hewMlJ11Iad59iZqOB6cBPwAx+Z6mHrHvUU0REKl82DvuIiEglU/iLiKSQwl9EJIUU/iIiKaTwFxFJIYW/iEgKKfxFysnM/pGZSLODmd2bebYaM+tgZqckXZ9IWSj8RcrBzOoDuPvyzMqzJxb/LLPmT9fEihMpB4W/SPl05veXIFhhZlvFVYxIRSn8RUqR2QFtr8z3V5nZ7UA94PfWnF+SOUYkqyn8RUo3BLjEzPoS9kE4E/gP0ATCEJCZ/RNoZ2YXZV6zLWGBLZGslnULu4lkC3efkFkd8Wygu7v/nNkP98TMz/8H/NLgzeyZsNTdf0ykYJFy0JW/SCnMrBVhtdGVmS0w8bAS4ggzq13CS7YBboyxRJEKU/iLlCCz8f0Iws5I35vZLxvLuPtEd1++7mvcfZ67fxhjmSIVpvAXWUfmqv5J4Bx3nwv8jTD+L1JlaD1/EZEU0pW/iEgKKfxFRFJI4S8ikkIKfxGRFFL4i4ikkMJfRCSFFP4iIimk8BcRSSGFv4hICv0/0XP6x2yMDy8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import sympy\n",
    "\n",
    "\n",
    "data = np.array([[3,3],\n",
    "                 [4,3],\n",
    "                 [1,1]])\n",
    "figure, ax = plt.subplots()\n",
    "ax.scatter(data[:, 0],data[:, 1],marker='o',edgecolors=\"b\",c=\"w\")\n",
    "\n",
    "(x1,x2) = sympy.symbols(\"x1,x2\")\n",
    "\n",
    "w = res[\"x\"]\n",
    "x_1 = np.array([x1, 0, 1])\n",
    "x_2 = np.array([0, x2, 1])\n",
    "y = np.array([-1,0,1])\n",
    "lines = list()\n",
    "for p in zip([(sympy.solve(e)[0],0) for e in np.sum(w*x_1)+y],\n",
    "             [(0,sympy.solve(e)[0]) for e in np.sum(w*x_2)+y]):\n",
    "    lines.append(p)\n",
    "# lines [H1, H, H2]\n",
    "\n",
    "for line_xs, line_ys in lines:\n",
    "    ax.add_line(plt.Line2D(line_xs, line_ys, color =\"red\"))\n",
    "\n",
    "plt.xlim([0,8])\n",
    "plt.ylim([0,8])\n",
    "plt.xlabel(\"$x^{(1)}$\")\n",
    "plt.ylabel(\"$x^{(2)}$\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## EX7.2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-02-13T23:12:21.037732Z",
     "start_time": "2019-02-13T23:12:21.024062Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     fun: -0.24999999999999978\n",
      "     jac: array([1.86264515e-09, 5.00000024e-01])\n",
      " message: 'Optimization terminated successfully.'\n",
      "    nfev: 16\n",
      "     nit: 4\n",
      "    njev: 4\n",
      "  status: 0\n",
      " success: True\n",
      "       x: array([2.49999993e-01, 3.55390643e-17])\n",
      "[0.49999999 0.49999999] -1.999999970119951\n"
     ]
    }
   ],
   "source": [
    "data = np.array([[3,3],\n",
    "                 [4,3],\n",
    "                 [1,1]])\n",
    "label = np.array([1,1,-1])\n",
    "\n",
    "from scipy import optimize\n",
    "fun = lambda alpha: 4*(alpha[0])**2 + 13/2*(alpha[1])**2+10*alpha[0]*alpha[1]-2*alpha[0]-2*alpha[1]\n",
    "cons = ({'type': 'ineq', 'fun': lambda alpha: alpha[0]},\n",
    "        {'type': 'ineq', 'fun': lambda alpha: alpha[1]})\n",
    "bnds = ((0, None), (0, None))\n",
    "res = optimize.minimize(fun, np.ones(2), method='SLSQP',bounds=bnds)\n",
    "print(res)\n",
    "alpha = res[\"x\"]\n",
    "alpha = np.append(alpha, alpha[0]+alpha[1])\n",
    "w = np.sum((alpha*label).reshape(-1,1)*data, axis=0)\n",
    "j = np.argmax(alpha)\n",
    "b = label[j] - np.sum(alpha*label*np.dot(data,data[j,:]),axis=0)\n",
    "#  0和2都OK，因为都为0.5 > 0\n",
    "# b = label[0] - np.sum(alpha*label*np.dot(data,data[0,:]),axis=0)\n",
    "# b = label[2] - np.sum(alpha*label*np.dot(data,data[2,:]),axis=0)\n",
    "\n",
    "print(w,b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-02-13T23:12:21.248914Z",
     "start_time": "2019-02-13T23:12:21.040304Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xd8TecfwPHPc2/2lL1JrAhZYlftFkWpKtoapUNtXcqvQ1FFS6uUaqnR0mFVVa22RtGaiZgxQkgiQXZC9r3n98eNoCUiyc3Njef9et2X5Jxzz/neIN/zjPN9hKIoSJIkSRKAytABSJIkSVWHTAqSJElSMZkUJEmSpGIyKUiSJEnFZFKQJEmSismkIEmSJBXTW1IQQlgIIQ4KIY4KIU4KIabc5RhzIcQqIUS0EOKAEMJXX/FIkiRJ96fPlkIe0FFRlBAgFOgqhGj5r2NeAtIURakLzAE+1mM8kiRJ0n3oLSkoOteLvjUtev37SblewLdFX68FOgkhhL5ikiRJkkpmos+TCyHUQDhQF1igKMqBfx3iBcQBKIpSKITIAJyA5H+dZxgwDEBtadukbp3a2JjrNfTKp2gh+SxoCsDZn/z4BLQ5OZjXq4cwMa7PmpOVT1ZqHk5e1qhN5LCVJFUF4eHhyYqiuNzvOL3+tlEURQOECiFqAOuFEIGKopwow3kWAYsA7Hz8Fat+s9g49lE87C0rOGIDS42Br9uBowN57X/iQp/+2D/RDc8Z0w0d2QNJjr/OqmkH6TQkgAYtPQwdjiRJgBDiUmmOq5TbOEVR0oGdQNd/7boM+AAIIUwAeyClpHPVcrImr0DDqO8jyC/U6iNcw3H0g95fQWIk5mcX4TR0KBnr15N9+LChI3sgTp7WWFibEn86zdChSJL0gPQ5+8ilqIWAEMISeBw4/a/DfgVeKPr6GWCHcp8KfeYmKj55JoSI2HRmbImq6LANr0E3aP0ahC/D+VFnTDw9uDJlKkpBgaEjKzWhEng3cCA+KhVZcFGSjIs+WwoewE4hxDHgEPCHoii/CSGmCiF6Fh2zBHASQkQDbwATS3Pi7sEeDG3tS/ilNHILNHoJ3qA6vg++bVD98TbuIweRd+4cqSu/N3RUD8S7gQM3MvJJS8w2dCiSJD0AYWx3ck2bNlUOHz5MfqEWraJgYao2dEj6kXUVvm6LYmpF/IkmZIcfofbmTZi6uxs6slLJTM5hxXv7eLRfPUI6+hg6HOkBFBQUEB8fT25urqFDkcrAwsICb29vTE1N79guhAhXFKXp/d5vXNNabmNWNKslI6eAuX+e483O9bGuTjOSbN2g7zLE8h64hdXjwkENV2d+jPfncwwdWanYOVti72JJfFSqTApGJj4+HltbW3x9fZEzxI2LoiikpKQQHx+Pn59fmc5h9PMFTyVksuyfGN5Zf7z69V/XegQem4zZ1W04dwsla+tWru/ZY+ioSs07wJHLZ9PRaKrZhIBqLjc3FycnJ5kQjJAQAicnp3K18ow+KbSq48Qbj9VnQ2QCK/eXasaVcXlkDDTogaPZRsx8dIPO2pwcQ0dVKj4BDhTkabgak2noUKQHJBOC8Srv353RJwWAUR3q0sHfham/nSIyLt3Q4VQsIeCpL1E51cQ9JIGC+HiSv1xo6KhKxau+A0JAXFSqoUORJKmUqkVSUKkEc/qH4mprwQcbTlS/biQLe+j3HdY10rAPtiVl2TJyz541dFT3ZWFtikstO+Kj5PMKknFavnw5CQkJejn3xYsXCQwM1Mu5y6NaJAWAGlZmLBnSlEWDm1bPpq97EPSYg2uds6gt1Fz5YDKKtur31fsEOHD1YiZ5OYWGDkV6SBQWVty/tZKSgkZTDafDU42SAkADdzvc7CzQaBX2nS/xwWjjFPo8Jq0G49roCjlHjpC+Zq2hI7ovnwaOKFqFy2dka0EqnYsXL9KgQQMGDBhAQEAAzzzzDNnZuuddwsPDadeuHU2aNKFLly4kJiYC0L59e1577TWaNm3K3LlzuXr1Kr179yYkJISQkBD++ecfAFauXEnz5s0JDQ3l1VdfLf7FbmNjw+uvv06jRo3o1KkTSUlJrF27lsOHDzNgwABCQ0PJycnB19eXCRMmEBYWxpo1a4iMjKRly5YEBwfTu3dv0tLSiuOZMGECzZs3p379+uy5zwSR3Nxchg4dSlBQEI0bN2bnzp0AnDx5sjje4OBgzp07x40bN+jevTshISEEBgayatWqCv35V6M5nLcs2XuBGVtO8+3Q5rStf9/6T8bliU+wTzhCxqWrXJs9C9tOHTFxdjZ0VPfkXtseEzMV8afTqB1azf4uHhL9v973n209gj0Y1MqXnHwNQ5Yd/M/+Z5p407epD6k38hmxMvyOfatebXXfa545c4YlS5bQunVrXnzxRb788kvGjRvHmDFj2LBhAy4uLqxatYp3332XpUuXApCfn8/hopIw/fv3p127dqxfvx6NRsP169eJiopi1apV/P3335iamjJy5Ei+//57Bg8ezI0bN2jatClz5sxh6tSpTJkyhfnz5zN//nxmz55N06a3pvc7OTkREREBQHBwMF988QXt2rVj0qRJTJkyhc8//xzQtVgOHjzI5s2bmTJlCn/++ec9P++CBQsQQnD8+HFOnz5N586dOXv2LF999RXjxo1jwIAB5Ofno9Fo2Lx5M56enmzatAmAjIyM+/48H0S1aincNLBlLeq72jLupyMkpBvHTJ1SM7VA9F+Be6s8lOzrXJ1etYvlqU1VeNZzkIPN0gPx8fGhdevWAAwcOJC9e/dy5swZTpw4weOPP05oaCjTpk0jPj6++D39+/cv/nrHjh2MGDECALVajb29Pdu3byc8PJxmzZoRGhrK9u3buXDhAgAqlar4/Tevdy83j8vIyCA9PZ127doB8MILL7B79+7i455++mkAmjRpwsWLF0v8vHv37mXgwIEANGjQgFq1anH27FlatWrF9OnT+fjjj7l06RKWlpYEBQXxxx9/MGHCBPbs2YO9vf39f6APoFq2FKzMTFg4MIye8/9m5PcRrH61VfHDbtWCgy/mQ77G6ezLJG/egv3TfbB5tLWho7onnwAH/l6bQlZqLraOFoYOR3pAJd3ZW5qpS9zvaG1WqpbBv/17XFAIgaIoNGrUiH37/ttyAbC2ti7xnIqi8MILLzBjxowHvv6DXOcmc3NzQJeUyjrO8fzzz9OiRQs2bdpEt27d+Prrr+nYsSMRERFs3ryZ9957j06dOjFp0qQynf9uqtFvyjvVdrHhk2eCiYyrpoXz/Lvi9PKLmNkWcuWd8WircEkCnwBHQE5NlUovNja2+Jf/Dz/8wKOPPoq/vz9JSUnF2wsKCjh58uRd39+pUycWLtRN3dZoNGRkZNCpUyfWrl3LtWvXAEhNTeXSJd2zTVqtlrVr195xPQBbW1uysrLueg17e3scHByKxwtWrFhR3Gp4UG3atOH773X1zc6ePUtsbCz+/v5cuHCB2rVrM3bsWHr16sWxY8dISEjAysqKgQMHMn78+OKurIpSbZMCQLcgD8Z38adniKehQ9ELVedJuPeoScG1NJJnf2jocO7J0dMaa3szYk/KpCCVjr+/PwsWLCAgIIC0tDRGjBiBmZkZa9euZcKECYSEhBAaGlo8gPxvc+fOZefOnQQFBdGkSRNOnTpFw4YNmTZtGp07dyY4OJjHH3+8eKDa2tqagwcPEhgYyI4dO4rvvIcMGcLw4cOLB5r/7dtvv2X8+PEEBwcTGRlZ5jv2kSNHotVqCQoKon///ixfvhxzc3NWr15NYGAgoaGhnDhxgsGDB3P8+PHiwecpU6bw3nvvlema92K0BfHKIju/ECuzatZjdv0aCc+1JeO8oPbqHzAPbGzoiO5qx4oozkck8dLsR1Gpq/W9iNGLiooiICDAYNe/ePEiPXr04MSJB16Pq8xsbGy4fv36/Q80Enf7OyxtQbyH5n/nvO3n6Dn/b27kVbP58jauuE6bi9pES+Ibw1Cq6NzpWo2cyM8p5MoFWfJCkqqyhyYpNPV14ELSdSb+XP0K55mEdMF1QCdyYq+TMWu0ocO5K+8AR1QqwaUT1fD5EalC+fr6VmorAahWrYTyemiSwiN1nHmzsz8bjybw3b7qVzjPfvx8rGrZcPWHHRQe3WrocP7D3NIE9zr2XDopk4IkVWUPTVIAGNGuDp0auDJt0ykiYqvXE7ZCpcJ9zjdoC1Vcffc13SI9VUytQCdS4q9zPS3P0KFIknQPD1VSUKkEn/ULxdfJuvo91AaYNwzBaWAfMqMF12c9C5qqNX5SK9AJgFjZWpCkKuuhSgoA9lambBnXhh7B1XOaqvOb72Pm4cSVTfFot3xg6HDu4OhpjY2DuexCkqQq7KFLCgAmRVMi14bH8+WuaANHU7FU5uZ4fDKHghsmJC3+Dk5vNnRIxYQQ1Ax0Ii4qFU1h1a/wKhlGSSWlJ02aVGINoYrQvn17yjrtvTp4KJPCTfvOpzBr2xl2nblm6FAqlFWzZtTo24fUszbkLB4JqRcMHVKxWo2cKMjVcOV8xRbxkh4OU6dO5bHHHjN0GNXaQ50Upj0ViL+bLa+tiuRyNRtjcH17AiZOjiT+Y47y4yAoqBqfz7uBAyq1nJoqlUyj0fDKK6/QqFEjOnfuXPw08ZAhQ4rLUfj6+vLBBx8QFhZGUFAQp0+fBiApKYnHH3+cRo0a8fLLL1OrVi2Sk5OBe5fOvpcff/yRoKAgAgMDmTBhQnFsQ4YMITAwkKCgIObMmQPAvHnzaNiwIcHBwTz77LN6+blUhmr2eO+DsTRTs3BgE3p+sbeocF5LzE3Uhg6rQqhtbXGfPIX40WNI+esizt7jodd8Q4eFmYUJnvVqcOlkCo/0qWvocKT72TIRrhyv2HO6B8ETM0s85Ny5c/z4448sXryYfv36sW7duuIqordzdnYmIiKCL7/8ktmzZ/PNN98wZcoUOnbsyP/+9z+2bt3KkiVLAEosnX03CQkJTJgwgfDwcBwcHOjcuTO//PILPj4+XL58ufhZivR03RLAM2fOJCYmBnNz8+JtxuihbikA+DlbM6tvMEfj0tkRVb26kWwfewzbLl1IPlWDvL9+gCMrDR0SADUbOZGacIOs1KpbxE8yLD8/P0JDQ4GSS0/frTz13r17i+/Uu3btioODA0CJpbPv5tChQ7Rv3x4XFxdMTEwYMGAAu3fvpnbt2ly4cIExY8awdetW7OzsAN3aCgMGDGDlypWYmBjv/bbxRl6BugZ6sGVcGwI87AwdSoVzf+9dzu/bx5UTvtT87U2EezB4BBs0plqBTvyzLppLx5MJbOdt0Fik+7jPHb2+3Cw7DbrS03crRnf7caUpT/0gpbNL4uDgwNGjR9m2bRtfffUVq1evZunSpWzatIndu3ezceNGPvroI44fP26UyeGhbyncdDMhRMalc+7q3UvlGiMTFxfc3h5PdmwO6bGOsHow5Bi2aevgboW9iyUxR5MNGodUPbVu3ZrVq1cD8PvvvxcvkVlS6ey7ad68OX/99RfJycloNBp+/PFH2rVrR3JyMlqtlj59+jBt2jQiIiLQarXExcXRoUMHPv74YzIyMoy2dIbxpTE9yi/UMnJlOBZman4d/Sg25tXjx2Pfpw8ZG3/jWsQxbJziMN0wCvqvhBIWEtEnIQR+Ic4c2xlPfk4hZpbV4+csVQ0ffPABzz33HCtWrKBVq1a4u7tja2uLs7NzcelsrVaLqakpCxYsoFatWnc9j4eHBzNnzqRDhw4oikL37t3p1asXR48eZejQoWi1umnVM2bMQKPRMHDgQDIyMlAUhbFjx1KjRo3K/NgVRm+ls4UQPsB3gBugAIsURZn7r2PaAxuAmKJNPyuKMrWk85andHZp7DufwoBv9vNEkAfzn2tc4gpMxiT/4kUu9HoKm0ZeeNffC49PhdbjDBZPwrl01n8aQeeXG1GvqZvB4pD+y9Cls8srLy8PtVqNiYkJ+/btY8SIEURGRho6rEpVVUtnFwJvKorSEGgJjBJCNLzLcXsURQktepWYECpDqzpOvNXFn03HEln+z0VDh1NhzHx9cR49iqyIC2TSFv6cAhfvvQ6tvrnXscfCxlR2IUkVLjY2lmbNmhESEsLYsWNZvHixoUMyKnprtyuKkggkFn2dJYSIAryAU/q6ZkUZ3rYOEZfS+GhTFC38nGjoWT0GoJ2GDCFz8xau/HkN66f8UK8ZCsP3gK17pceiUgl8g5yIOZqMRqNFLRfekSpIvXr1OHLkiKHDMFqV8j9RCOELNAYO3GV3KyHEUSHEFiFEo8qI535UKsGnfUN5u6s//u62hg6nwghTUzw+/BBNahrXrraG/Ouw9kWDFc7zC3EhL7uQxHPGO6dbkqobvScFIYQNsA54TVGUfy+7FQHUUhQlBPgC+OUe5xgmhDgshDiclJSk34CL2FuZMqxtHdQqQfL1PDTa6rEwj2VgIxyHDCF94x/cqP0aXPobtk8xSCw+AY6oTVWyC0mSqhC9JgUhhCm6hPC9oig//3u/oiiZiqJcL/p6M2AqhHC+y3GLFEVpqihKUxcXF32G/B/XsnLp+vkePv/zbKVeV59cxozG1MeHxGU70AYPgX/mQdRvlR6HqbkanwYOxBxNrnar4UmSsdJbUhC6aTtLgChFUT67xzHuRcchhGheFE+VKorjamtBB38XvtgRzc5qUjhPZWmJx7RpFMTGkhTlAp5h8MsISDlf6bH4hbiQlZpLymXjnNMtSdWNPlsKrYFBQEchRGTRq5sQYrgQYnjRMc8AJ4QQR4F5wLNKFbxl/PCpQAI87Hh9VSTxadmGDqdCWLdojsPzz5G68gey/d8GlRpWv1DphfN8g51BILuQpDts3boVf39/6taty8yZ936qumvXrtSoUYMePXrc85jbi+hJ96e3pKAoyl5FUYSiKMG3TTndrCjKV4qifFV0zHxFURopihKiKEpLRVH+0Vc85WFhqmbhgDA0GoWR30eQV1hyZUVj4frmm5h6eJA4Yx7a7gvg6gnY9FalxmBlZ4a7n51MClIxjUbDqFGj2LJlC6dOneLHH3/k1Km7T1ocP348K1asqOQIqzc5D7CUfJ2tmd0vBDc7C/KryQIxKmtrPKZ9SP7FiyRtOQVtx0PkSoj4rlLj8AtxISk2SxbIkwA4ePAgdevWpXbt2piZmfHss8+yYcOGux7bqVMnbG1LP0Nw+/btNG7cmKCgIF588UXy8nTrhU+cOLG47PVbb+lujNasWUNgYCAhISG0bdu2/B/MSMj6Ag+gSyN3Ojd0qzZPOQNYP/IINfr2JXXZcuweW4ll7UO61oJHiO5VCWqHurBv/XkuHEkipJNPpVxTKp2PD37M6dTTFXrOBo4NmNB8wj33X758GR+fW/8OvL29OXDgbrPZH0xubi5Dhgxh+/bt1K9fn8GDB7Nw4UIGDRrE+vXrOX36NEKI4rLXU6dOZdu2bXh5eRl1KewHJVsKD0gIQUJ6Ds8u2seZK9WjcJ7r2+MxcXUl4f330T75JVg7V2rhvBpuVjh5WXP+SPUYyJeqpjNnzuDn50f9+vUBeOGFF9i9ezf29vZYWFjw0ksv8fPPP2NlZQXoCusNGTKExYsX33cxnupEthTKwEQliL52gxErw9kwujW2FqaGDqlc1La2eHw4lbhXhpG8fDWufb+FZU/A+uHw7A+g0v+9Q50wVw7+FsON9Dysa5jf/w1SpSjpjl5fvLy8iIuLK/4+Pj4eLy8vDhw4wKuvvgro7uJ79uxZIdczMTHh4MGDbN++nbVr1zJ//nx27NjBV199xYEDB9i0aRNNmjQhPDwcJyenCrlmVSZbCmXgamfB/Ocbcyk1mwnrjlWLOfY2bdpg37s3Kd98Q06GFXT5CM5ugb8/r5Tr1wlzBQXZWpBo1qwZ586dIyYmhvz8fH766Sd69uxJixYtiIyMJDIyskwJwd/fn4sXLxIdHQ3AihUraNeuHdevXycjI4Nu3boxZ84cjh49CsD58+dp0aIFU6dOxcXF5Y5EVZ3JpFBGLWs7Mb6LP5uPX2Hp3xcNHU6FcJs4ARNHRxLfeQcldAgE9oEdH0LMbr1f29HDGkdPa85HVM4T61LVZWJiwvz58+nSpQsBAQH069ePRo3uXgGnTZs29O3bl+3bt+Pt7c22bdvueV4LCwuWLVtG3759CQoKQqVSMXz4cLKysujRowfBwcE8+uijfPaZ7rGq8ePHF6/P/MgjjxASUjljbIamt9LZ+qLv0tkPQlEUhq0IJz4th19Ht8a0GhR1y9qxk/iRI3EeNQqXYUNgcQfISYNX94Cdh16vffC3GA5timHIzNZY28suJEMx9tLZUtUtnV3tCSH4tF8Ia4e3qhYJAcC2YwfsnnyS5K+/JjcmHvqtgPxsWDsUNAV6vXadMBdQ4MIR2VqQJEOpHr/JDMjOwhRrcxOy8wtZuOt8tSic5/bO/1DXqEHCO++gONSBnvMgdh/8OVmv13XytMHB3YrzEXJcQZIMRSaFCrLzdBIfbz3NZ3+cMXQo5Wbi4ID7pPfJOxVF8uLFEPQMNHsF9s2HU7/q9dp1wlxJOJdOdma+Xq8jSdLdyaRQQboHe9C/qQ8Ldp5ne9RVQ4dTbnadO2PXrRvJXy4kNypKNxvJqwlsGKXXwnl1m7iiKHBBzkKSJIOQSaECTenViIZFhfPiUo2/cJ7b+++hdqhBwtsT0GoF9P0WVCawapBunEEPHD2tqeFmRbSchSRJBiGTQgWyMFXz1cAmKMD/fj5u6HDKzcTBAY8PPyTv3DmSv5gPNXygz2K4dgo2vQl6mLkmhKBOmAsJZ9NkF5IkGYBMChWsppMVXw9swoyngwwdSoWwbd8e+2f6kLJkCdlHjkDdx6DdBDj6A0R8q5dr1mvqhqJAdLjsQnpY2djYGDqEh5ZMCnrwSF1nfBytUBSFs1eNvz6S28SJmLq7kzjxf2izs6Hd21CnI2x+GxIiK/x6Tl42OHlZc/bglQo/t2S8CgsNs5b4w0YmBT36Ykc0Pefv5fSVfy9NbVzUNjZ4TJ9O/qVLXPtsjm5Bnqe/AWsXWD0IslMr/Jr1m7tzNSaTjKTKXfRHqlp27dpFmzZt6NmzJw0bNjR0OA8FWRBPj55rXpOV+y8xYmUEG0a3xs6IC+dZt2yBw6BBpK1YgW2njli3agX9voOlXXSF8577qUIL59Vr5sa+9ec5d+gKTbv5Vdh5pQdzZfp08qIqtnS2eUAD3N95p9THR0REcOLECfz85L+DyiBbCnrkYmvO/OfDiE3N5u01xl84z/WN1zHz9SXh3XfRZGWBdxPoOgPObYO9d12Gu8xsHS3wrFeDswevGv3PTSqf5s2by4RQiWRLQc+a+zkysWsDPtocxZK9MbzcprahQyozlaUlnjNncPH5AVydORPPjz6CZi9D7H7Y+RF4N4Xa7SvsevWaufHXD2dIjruOS83Sr64lVZwHuaPXF2tra0OH8FCRLYVK8HIbP55rXpMADztDh1JulqGhOL38MhnrfiZrx04QAp6cC071YO1LkJlQYdeq28QVlVrIAWdJqkQyKVQCIQQzng6idV1nAKOvj+Q8ehTm/v4kTppEYVoamNtA/xVQkANrKq5wnoW1KTUbOXHu0FW0Rv4zkyRjIZNCJftyVzSDlx6gUKM1dChlpjIzw/PjmWgyMrgyZaquz9/FH3p9AXH74Y8PKuxa9Zu7cSMjn4SzaRV2Tqnqu379OgDt27fnt99+M3A0DxeZFCqZq60Ff0en8OkfZw0dSrlYNGiAy6hRZG3dSubGjbqNgX2g+auwfwGc/KVCruMX7IyphZqzh4y/npQkGQOZFCrZM028ea65Dwt3neePU8b9i87plZexbNKEK1M/JD/+sm5j52ng3Qw2jIbk6HJfw8RMTZ1QF85HJFFY8PAsni5JhiKTggF88GQjAr3seGN1JLEpxls4T6jVeH78MSgKCRMmoGg0YGIGfZfr/lw9CPJvlPs69Vu6k59TSExkcvmDliSpRDIpGICFqZqFA5pgbqIiMj7d0OGUi5m3F+6T3icnPJyUb5boNtp7Q59v4FoU/PZGuQvnedd3wNbRgqh9iRUQsSRJJZFJwUB8HK34a3wHeoZ4GjqUcrPr2RPbJ7qS9MUX5Bw/odtYpyN0eAeO/QThy8p1fqES+LdyJy4qlazU3AqIWJKke5FJwYCszXXPDm49kcgvRy4bOJqyE0LgMXkyJs7OJIwfryuaB9DmLaj7OGyZAJcjynWNgFYeoMCZ/bK1IEn6pLekIITwEULsFEKcEkKcFEKMu8sxQggxTwgRLYQ4JoQI01c8VZWiKKzYf4kJ645xKsF4C+ep7e3xnDmD/EuXuDprlm6jSgVPLwIbN1j9QrkK59k5W+LlX4OofVdk2QuJ5cuXM3r06BKPmTx5MrNnz9ZbDNOnT9fbuQ1Jny2FQuBNRVEaAi2BUUKIf5c5fAKoV/QaBizUYzxVkhCCuc82poaVKSO/Dyczt2Ie/DIE65YtcRw6lPQffyJr1y7dRitH6PctXL8CPw8Dbdmfzwho5UFmUg6J0cY9DiNVDzIpPCBFURIVRYko+joLiAK8/nVYL+A7RWc/UEMI4aGvmKoqZxtzFjwfRnxaDm+tPmrUd8Iur43TPe387nsUpqToNnoVFc6L/gP2fFrmc9cOc8XUQk3U37ILqbp76qmnaNKkCY0aNWLRokUALFu2jPr169O8eXP+/vvv4mM3btxIixYtaNy4MY899hhXr96a6n306FFatWpFvXr1WLx4MaBrnY8fP57AwECCgoJYtWpVidsTExNp27YtoaGhBAYGsmfPHiZOnEhOTg6hoaEMGDCgsn4slaJSCuIJIXyBxsCBf+3yAuJu+z6+aNsd/+uFEMPQtSSoWbOmvsI0qKa+jkx8ogHTNkWx62wSHfxdDR1SmajMzPCaPYuYPs+Q+O57eC/8EiEENH0JYg/cKpxXp8MDn9vUTE29pm6cPXiFNs/Wx8xC1nPUtz2rz5Icd71Cz+nsY0ObfvVLPGbp0qU4OjqSk5NDs2bN6N69Ox988AHh4eHY29vToUMHGjduDMCjjz7K/v37EULwzTff8Mknn/Dpp7qbj2PHjrF//35u3LhB48aN6d69O/vQ2rURAAAgAElEQVT27SMyMpKjR4+SnJxMs2bNaNu2Lf/8889dt//www906dKFd999F41GQ3Z2Nm3atGH+/PlERlb8IlOGpveBZiGEDbAOeE1RlDJ1miuKskhRlKaKojR1cXGp2ACrkJce9WPlSy2MNiHcZF6vHq5vvcX1XbtIL7rb0hXO+xxcGsC6lyCjbAPrAY94UJivlUt1VnPz5s0jJCSEli1bEhcXx4oVK2jfvj0uLi6YmZnRv3//4mPj4+Pp0qULQUFBzJo1i5MnTxbv69WrF5aWljg7O9OhQwcOHjzI3r17ee6551Cr1bi5udGuXTsOHTp0z+3NmjVj2bJlTJ48mePHj2NrW70r9ur1VksIYYouIXyvKMrPdznkMuBz2/feRdseSkIIHq2nK5p35koWDlamuNpZGDiqsnEYOIDru3dzdcZMLMPCsKhfH8ysdYXzFrWHNUNgyCbdQ24PwM3PjhpuVpz+J5GGrY1/Om9Vd787en3YtWsXf/75J/v27cPKyor27dvToEEDTp06ddfjx4wZwxtvvEHPnj3ZtWsXkydPLt4nhLjj2H9/Xxpt27Zl9+7dbNq0iSFDhvDGG28wePDgBz6PsdDn7CMBLAGiFEW51wosvwKDi2YhtQQyFEV56DuMs/MLeW7xfkb/eMRoC+cJlQrPmTNQ2dqS8OabaHOKltV0rge95kP8Qfhj0oOfVwgCWnuQeD6D1ITyPy0tVT0ZGRk4ODhgZWXF6dOn2b9/Pzk5Ofz111+kpKRQUFDAmjVr7jjey0s3XPntt9/eca4NGzaQm5tLSkoKu3btolmzZrRp04ZVq1ah0WhISkpi9+7dNG/e/J7bL126hJubG6+88govv/wyERG66dWmpqYUFBjvxJB70Wf3UWtgENBRCBFZ9OomhBguhBhedMxm4AIQDSwGRuoxHqNhZWbCe90DOBiTyuzfjbdwnomzM54zZ5J3LpqrMz++taNRb2gxAg4shBN3a0CWLKCVByoTwYk9D22jslrr2rUrhYWFBAQEMHHiRFq2bImHhweTJ0+mVatWtG7dmoCAgOLjJ0+eTN++fWnSpAnOzs53nCs4OJgOHTrQsmVL3n//fTw9PenduzfBwcGEhITQsWNHPvnkE9zd3e+5fdeuXYSEhNC4cWNWrVrFuHG62fXDhg0jODi42g00C2Ob6dK0aVPl8OHDhg6jUryz/jg/HIhl8eCmPN7QzdDhlNnVWbNIXbIUr7lzsevSWbexMB+Wd4drp+CVneDyYN0Uvy85yaUTKQyZ2RpTc7Ueon54RUVF3fFLVzI+d/s7FEKEK4rS9H7vlU80V2GTejQkyMueN1ZHEpdqvIXzXMeNwyIoiMT336fgctHdfXHhPHNd4by8B5vhEtjOi/ycQs4dNu5Ks5JU1cikUIVZmKr5ckAYA1rUws1IB5wBhJkZXp99ChoNl8e/jVJYqNth7wXPLIXks/Dbaw9UOM+jjj2Ontac3C27kCSpIsmkUMX5OFox8YkGmJmoyM4vNHQ4ZWbm44P7lCnkRESQtGDBrR212+sK5x1fA4e+KfX5hBAEtvXi2qUsrl0y3vIgVZWxdStLt5T3704mBSNxOT2Hxz/bzepDcfc/uIqy79Ed+6efJuWrr7mx/7bnGB99E+p1ga3/g/jwUp+vfgt3TMxUnJCthQplYWFBSkqKTAxGSFEUUlJSsLAoe8+CHGg2EhqtwuClBzh8MY2fRz5CI097Q4dUJtrsbGL6PIP2xg38NvyCiYODbkd2Kixqp+tCenW3rmZSKexceZqzB64w5OPWmFuZ6jHyh0dBQQHx8fHk5soy5cbIwsICb29vTE3v/P9Q2oFmmRSMSMr1PLrP24uZiYqNYx7F3tI4fwnmRkVxsV9/rFu3vlUGA3TltZd2Ab+28PwaXZXV+0iKzWL19EO06V+P4A4+9z1ekh5WcvZRNeRkY86CAWEkpOfw5uqjaLXGldBvsggIwHX8eK7v2kXq7Q8beYXBEx9D9J+we1apzuVS0xZXXztO/HVZdndIUgWQScHINKnlwDvdAriRV0i2ES9k7zBoIDadOnFt9qfk3F5UrMlQCH4Wds2A6O2lOldwey/SrmQTF1X29RokSdKRScEIDW3ty8qXW2BjbrxVQoUQeE7/CFN3d+Jff4PCtLSbO6DHHHANgHUvQ0b8fc9Vt4kbVnZmHN1+/2MlSSqZTApGSAiBWiW4lpXLqO8juJppnAOCant7vObMQZOcTMLEiSg3F+Axs4J+K0BToFuxrTC/5POYqghs50XsyRTSrsh6SJJUHjIpGLH07AJ2nL7GmB+OUGCkhfMsgwJx/d9Ebvy1m5TFtz2n4FxXVzjv8mH4/b37nqdRGy/UJiqO7ZCtBUkqD5kUjFh9N1tmPB3EwYupzNp2xtDhlJnDc89h1+0JkubO5cbBg7d2NHoKWo6Cg1/D8bUlnsPKzoz6zd04vT+R3BvVr3KlJFUWmRSM3FONvRjYsiaLdl9g64krhg6nTIQQuE/9ELOaNbn85psUJiff2vn4FPBpCb+OhaSSE19wRx8K87Wc2pug54glqfqSSaEaeL9HQ0K87Zm3/ZzRTlNV21jjNXcu2swsLr81HkVTNLNKbaornGdmBatKLpzn7G2Dl78Dx3fFozHS7jRJMjSZFKoBcxM1Xw9qyo+vtESlevCVpaoKC//6uE+aRPb+/SQv+PLWDjsPXeG8lHOwcWyJhfNCOvlwPS2PC0eSKiFiSap+ZFKoJtztLbC3MiWvUMP6I/FG+yBXjT5PY9+7N8kLF3J979+3dvi1hY7vwYl1cHDxPd/vG+iEvYslR7fHGe3PQJIMSSaFambN4XheX3WUVUZcOM990vuY161Lwltv3Vp/AaD161C/K2x7B+IO3fW9QiUIfcyHqzGZJJxLr6SIJan6kEmhmnmueU3a1HNm0q8nOXE5w9DhlInK0hLvL+ahFBYSP2Ys2puF2VQq6P0V2HnCmiFwI+Wu72/QygNLW1Mitl2qvKAlqZqQSaGaUasEc59tjJO1GSO+Dycj2zinZ5r5+uL5ySfknjrFlSlTb3UFWTpAv+/gRhL8/DJo/1vqw8RMTUgnH2JPppIUl1XJkUuScZNJoRpytDZjwYAwrmTk8u4vxw0dTpnZduyA88iRZKxfT/qqVbd2eIZCt0/g/A7465O7vjewrRemFmqOyNaCJD0QmRSqqbCaDsx6JoSxneoZOpRycR49Cut2bbny0XSyjxy5tSPsBQh5Hv76GM79+Z/3mVuZEtjWi+jwa2QkGe/61pJU2WRSqMaeauxFfTdbFEUx2vpIQqXC65NPMHV35/K41yhMKppqKgR0/xTcGum6kdL/O7Ae0skHlVrFkT+Md9BdkiqbTAoPgc//PEf3eXu4kmGciUFtb4/3/C/QZGYS/9rrKAVF4yRmVrrxBa0G1rwAhXl3vM/a3pwGrdw5/U8iNzLy7nJmSZL+TSaFh0CPYA+y8zWM/iHCaAvnWfj74/Hhh+SEh3P1k9sW4HGqA70WwOVw2Pbuf94X+nhNtBotx3bI1oIklUapkoIQYpwQwk7oLBFCRAghOus7OKli1CsqnHf4Uhozt5w2dDhlZv9kDxxfGEzaihVk/PrrrR0Ne8IjY+DQYji25o731HC1om5TN47vukzO9ZJLcEuSVPqWwouKomQCnQEHYBAwU29RSRWuV6gXg1vVYsneGDYfTzR0OGXm+tZbWDVrRuL7k8g5cfLWjk6ToeYjujIY16LueE/Tbr4U5GuI/CO2coOVJCNU2qRws6BON2CFoignb9smGYl3uwfQtr4LZmrj7TUUpqZ4fT4HtZMj8aNGUXDtmm6H2gT6LgMzm6LCebeeT3D0sKZeUzeO7bpMTpZsLUhSSUr72yFcCPE7uqSwTQhhC5TYOS2EWCqEuCaEOHGP/e2FEBlCiMii16QHC116UOYmar4d2ozHGroBGG1tIBMnJ3wWLNANPI8ZgzavaBDZ1l1XOC/1PPw65o7Cec26+6LJ13Dkd9lakKSSlDYpvARMBJopipINmAJD7/Oe5UDX+xyzR1GU0KLX1FLGIpWDELoG3pK9MUxcd9xoE4NFQACeH88k9+gxrkyadOtz+LWBTpPg5Ho48HXx8Q7u1tRr5sbxv+LJzpStBUm6l9ImhVbAGUVR0oUQA4H3gBIL6yiKshtILWd8kp5k5Raw6nAcPx403lk5dp074zxmNBkbfiV16dJbO1q/Bv7d4Pd3Ie7WSm7NuvuhKdBy5Hf5lLMk3Utpk8JCIFsIEQK8CZwHvquA67cSQhwVQmwRQjS610FCiGFCiMNCiMNJSbJOfkUY27Eebeu7MPnXkxyPN87CeQDOI0di27Ur12Z/StauXbqNQsBTC8Heu6hwnm4ltxpuVtRv7s6Jvy7L5xYk6R5KmxQKFV37vBcwX1GUBYBtOa8dAdRSFCUE+AL45V4HKoqySFGUpoqiNHVxcSnnZSUAlUrwef9QnG10hfPSs42zS0UIgeeM6ZgHNCDhzbfIi47W7bCsUVQ4LxnWvVRcOK9pN180hVpZQVWS7qG0SSFLCPE/dFNRNwkhVOjGFcpMUZRMRVGuF329GTAVQjiX55zSg3G0NuPLgU1Iyspjb3Ty/d9QRaksLfFZsABhaUncyFFo0ovWUfAIge6z4cIu2KWbQV3DzYoGj3hwYvdlMpNzDBe0JFVRpU0K/YE8dM8rXAG8gVklv6VkQgh3UTTqKYRoXhTL3QvkS3oT6lODPW93oEewp6FDKRdTDw+8v5hHYWIi8WPHoeQXtXzCBkPoQNj9CZz7A4DmPfwQQnBwY4wBI5akqqlUSaEoEXwP2AshegC5iqKUOKYghPgR2Af4CyHihRAvCSGGCyGGFx3yDHBCCHEUmAc8qxjrVBgj52pnAcCec0n8c954WwxWjRvj8dE0sg8eJPGDybdmJHWfDW5B8PMrkB6LjYMFIR29OXPwCsnxcr0FSbpdactc9AMOAn2BfsABIcQzJb1HUZTnFEXxUBTFVFEUb0VRliiK8pWiKF8V7Z+vKEojRVFCFEVpqSjKP+X9MFLZabQKH22KYswPR4y2cB6Afc+eOI8eTcb69aR8XTQl1dQS+n0LWi2sHgyFeTTuXAtzSxP2rb9g2IAlqYopbffRu+ieUXhBUZTBQHPgff2FJVU2tUow//kwcgs0jDLiwnkAzqNGYtfzSZI+n0vGb5t0G53qQO+FkHAEtk7EwtqUJl19iT2ZQvyZNMMGLElVSGmTgkpRlGu3fZ/yAO+VjERdVxtm9gkm/FIaMzYbb+E8IQQe06Zh1bQpif/7H9nh4bodDbpD63FweCkcXUVQBy9sHMzZ93O00T7EJ0kVrbS/2LcKIbYJIYYIIYYAm4DN+gtLMpQnQzwZ8ogvS/+O4dBF4332UGVmhvf8LzD18iJ+1GjyL17U7eg4CWo9ChvHYZJ6hhY9a3PtUhbR4ddKPJ8kPSxKO9A8HlgEBBe9FimKMkGfgUmG8063AOb0D6FpLQdDh1Iu6ho18Fn0NQhB3KvDKUxL0xXOe2YpWNjB6kHUD7HCycuGfT+fpzBfY+iQJcngSt0FpCjKOkVR3ih6rddnUJJhmZmo6N3YGyEEsSnZZOcXGjqkMjOrWRPvBfMpSEzUFc/LzwdbN3hmGaTGoPptDG361SUrNZfIP2WxPEkqMSkIIbKEEJl3eWUJITIrK0jJMDKyC+i5YC/vrj9h1H3uVmFheM6cQc7hcBImTEDRasG3NTz2AZzagFfqT9QJcyF86yWupxnvzCtJqgglJgVFUWwVRbG7y8tWURS7ygpSMgx7K1NebO3H+iOX+f6Acd9F23Xrhuv48WRt2crV6TN0Se6RsdCgB/zxPo+0zELRwj8/nzd0qJJkUHIGkVSi0R3q0t7fhakbT3E0Lt3Q4ZSL00sv4jhkCGkrV5KyaLGucF6vBWDvg90fL9K4vRPnDl0lMdq4P6cklYdMClKJVCrBnH6huNiaM/L7CNJuGGfhvJtc3x6P3ZNPkjRnDunrftYVzuu/AnLSCMv8AOsaZuxZfQ5Fa7zdZZJUHjIpSPflYG3GlwPCaFPPGQtTtaHDKRehUuH50TSsW7cmcdIksnbuBPcg6P4pprHbaVX/BEmxWUT9Y7zrWEtSecikIJVKiE8NZvYJxtJMTaERP+0MIMzM8Jo7F4sGDbj8+htkHzkCjQdC40HUvzQBDy8t/6yPlus5Sw8lmRSkBxKXms0Tc/ew55xxL3aktrHGZ9HXmLi5Ej98BHnnz0O3WQiPYNor71GQW8jf66INHaYkVTqZFKQH4mRjhhAw7qdIEtKNez0CEycnan7zDZiaEvvyKxQkpUG/73A0S6Cx827O7L8i6yJJDx2ZFKQHYmVmwsKBTcgv1DLqhwjyC427K8nMx4eai75Ge/06sUNfpFBrC72/pikLsLO6wV8/nEFTYNyfUZIehEwK0gOr42LDJ88EcyQ2nembowwdTrlZNGyIz9dfU3DtGrEvvoTGrRUmbUbRznw26VezifhdLt0pPTxkUpDKpFuQBy+29iMyLp3cAuOvGWQV1hifBfPJj4khdtiraJq/Tk1/W+pa7iN8SwzpV7MNHaIkVQqZFKQy+1+3Bqx+tZXRT1O9yfqRR/D6fA65J08SP3os2h4LedTtF0y02exYfhytfHZBegjIpCCVmalahZmJiozsAib/epIbecZbOO8m206d8Jw5k+xDh4h/dxpWz3xKG9tvSIy5wfEdcYYOT5L0zsTQAUjG71RiJt/tu0hadj6f9w9FCGHokMrF/skeaLOzufLBB1y2tKLe0x2IXneI/eu11ApypoablaFDlCS9kS0Fqdxa1XHijcfrsyEygZX7q8egrEP/frhOmEDW1q0k/hpHu8bRqLXZ7Fh8UJbAkKo1mRSkCjGyfV06NnBl6m+niDTywnk3OQ0dgssbb5D52yYyjlnT2v1XEuO1HNtm/DOuJOleZFKQKoRKJfisXwhudhZM/vWkUa+/cDvnYa/g8vrrZG7ehm2SilrmEezfGEd6glxORKqe5JiCVGFqWJmx5IVmOFibGv24wu2cXx0GikLS558T0KaAKyb1+P2LnfT58EnUJvK+Sqpe5L9oqUL5u9viamtBoUbL39HJhg6nwjgPfxWX18aRv2c/odlbSUqz5eDyPw0dliRVOJkUJL34Zm8MA5cc4K+zxl0473bOw4fjMm4s1gd24Zuzj4jDKuIPnTJ0WJJUoWRSkPTihVa++LvZ8tpPR7hs5IXzbuc8YgTOY8dQ69BqbAqu8ed3Z8hNzzJ0WJJUYWRSkPTC0kzNlwPCKNAojPw+grxC4y+FcZPLyJG4vzaagKPLyc63Zsdnv1SbgXVJ0ltSEEIsFUJcE0KcuMd+IYSYJ4SIFkIcE0KE6SsWyTBqu9gwu28wR+PSmbH5tKHDqVDOw16h7rjB1L6wkZhrXhxfvs7QIUlShdBnS2E50LWE/U8A9Ypew4CFeoxFMpCugR5M6NqAp8O8DB1KhXMcNJAWr7TFKeU4e/fbkbD3H0OHJEnlprcpqYqi7BZC+JZwSC/gO0XX7t4vhKghhPBQFKXExXFTc1P5Pur7CoxU0jc7NzieBcejIK9Qg7lJ9SigB0AQ2F1J4EaEJ5uWZfKUWxQu9QIMHZUklZkhn1PwAm6vMBZftO0/SUEIMQxdawILXwtmHpxZKQFKUqnYQxu3owSmvc4fk7fT9zMnTN1cDR2VJJWJUTy8pijKImARQOMmjZVdz+4ybEBSmRyMSeHVFeF0buTOzKeDqtUDbvFZ8Sz5ZB51VP3ZMeIzOnw+ErOaNQ0dliQ9MEMmhcuAz23fexdtK5FaqLE3t9dbUJL+PN7Anjcf0zJr2xla+abzwiO+hg6pwmTmZfJHw38IPdGIaOUxbF56l7DPJ2LZqJGhQ5OkB2LIKam/AoOLZiG1BDLuN54gGb8R7erQqYEr0zadIiI2zdDhVBghBAiwGeyCk2kiJ2o9S9Qrb3LjHzn4LBkXfU5J/RHYB/gLIeKFEC8JIYYLIYYXHbIZuABEA4uBkfqKRao6dIXzQqntbMPVjFxDh1NhVEL3X0lYWtB9TCimpvkc9R/K+RGvkbFpk4Gjk6TS0+fso+fus18BRunr+lLVZW9lyuZxbVCrqs+Yws2koFW02PoH8USvs/zySw2iGr+M+q230aSk4Dh4sIGjlKT7k080SwZxMyGsOhTLgp3RBo6m/AS6z6NFC4BH1z60Cz5JskVdYlu/wtXpM7j6ySwUrdaQYUrSfcmkIBnUoYtpzP79DLvOXDN0KOVys6Vwe7mLhsNGEeK6nwsmwaR0G0Xq0qXEjx2LNjvbUGFK0n3JpCAZ1Ie9AnWF81ZFEp9mvL8sb06v1Sq3tQRMzHlk3PP4WYVzNLsB+cM+4PqOnVwaNJiCq8adBKXqSyYFyaAszdQsHNgEjZEXzrt9TOGO7U6+dH4pBDfTc+yLdsJsyhfkxcRwsX9/ck9Xr3pQUvUgk4JkcH7O1szqG8yx+Ax2njbO9RdURf+VFP5bLdWkUWe6d8vARlxl514tNeZ/C8DF5weQtXNnpcYpSfcjk4JUJXQN9OD319vSNdDd0KGUyV27j25j2WU8T4b8jqogi99/TcZ58UrM/fyIHzWalOXLZeltqcqQSUGqMuq72QIQfimNs1eNa+Gauw0033mAGvsBn9HD6ytyM7PZsuIirguXYNupE9dmfkzChAloc6vPcxuS8ZJJQapS8go1jPkhguErw7meV2jocEqtOCncpfuomLUzroM/pIfDR2Ql3+C3xWdwnjELl3Fjydz4Gxeff56Cy/et9CJJeiWTglSlmJuo+bRfKBeTbzBh7TGj6VYpfk7hHt1HxXya4/nkQLraTyf1ciabvjyB/YvD8F74JQWxccQ805cb+w9UQsSSdHcyKUhVTqs6Tozv0oBNxxNZ9vdFQ4dTKveafXRXLYZTK8yXznafcjUmg80Lj2HxSBt816xG7eRI7EsvyXEGyWBkUpCqpOHtavN4Qzemb44iKjHT0OHcV6m6j24SAnp+QR3vZDq5LOXymTQ2zT+K8PDB96dV2HbsoBtnGP822hs39By5JN1JJgWpShJCMLtvCP/rFoB/0QB0VXa/2Uf/YW4L/b7D33w7j9XeSMK5dH6bfxSNiTlec+fi8tprZG7eTEzffuSePavHyCXpTjIpSFWWvaUpLz3qh0oluJaVi0ZbdbtTbj6nUOqkAOAaAE/Oo/6NpXRudpwrFzLZOC+SgjwtzsNfpebSpWiyMrnYrz/pa9fK7iSpUsikIFV51zJzeeLzPXz+Z9W9Y77vlNR7Ce4LzV6mbuwkujyRw7WLWWyYG0nujQKsW7ag9vr1WIU1JvG993XTVmV3kqRnMilIVZ6rnQWdAlz5Ykc0O09XzZpBxd1HlKEKapfp4NWEOidepevzziTHZ/Hz7Aiup+Vi4uyMz+LFOI8dQ+Zvm3TdSWeqbnKUjJ9MCpJRmNorkIYedry2KpK41KpZOE8lVA/WfXSTiTn0XQ4qNX7Hh/Pk8AZcT8tl3SfhpCbeQKjVuIwceVt3Uj9SV6yUZbglvZBJQTIKFqZqFg4MQ6voCuflFlS9wnkqVGXv969RE57+Bq6exDv6Q3q/0RiNRuHn2eFcuZABUNydZN2yJVc/+oi4V4bJaqtShZNJQTIatZys+bRvCF41LCmsgoPOQoiytRRuqvcYtHsbIr/HJWk9fcY3wdzKlA1zjnDxWDIAJs7OeH+1EPfJH5AdHk5Mz55kbvu9gj6BJMmkIBmZzo3c+WpQE2zMTarcbByVUJVtTOF27SZAnY6weTz2BWfoM74JDh7WbFp4jMg/Y1EUBSEEDs8+i9/PP2Pq48PlceNImPg/NNevV8wHkR5qMilIRik+LZt+X+/j9JWq82CbSpSj+6j4JGpdN5K1M6wejJXpDXq/GUbtUBf+XhvNrpWn0RTqEo95bT98f/wBpxHDyfj1V2J6PcWN/fsr4JNIDzOZFCSjZGai4mJKNiNWRpCVW2DocIqVq/voJmsn6PstZCbA+hGYmgq6vhJIkydqcervRDbOiyT3uu4zC1NTXMeNo9bKlWCiJnbIUBLfn4Qmy7iqzEpVh0wKklFytbVg/nONiU3N5u0qUjivzLOP7sanmW6q6tkt8PcchErQslcdHhvakCsXMlnz8WGS4291F1mFNab2L7/g+OKLpK9bx4UeT5K1a1fFxCI9VGRSkIxWi9pOvN3Fny0nrrBkb4yhw9HNPipN7aPSav4KBPaBHdMgZjcA/i3ceeqNxhTma1j38WHO7E+8dX1LS9zeHo/vTz+itrMlfvgILo9/m8K0tIqLSar2ZFKQjNqwtrXp3NCN9UcuU6gx7Lz9cs8++u8J4cl54FQP1r6o604C3Gvb0++dZrj52fHn8ih2/XAGTcGt61oGB+O7bh3OI0eSuWULF3o8ScbGjVWiNSVVfTIpSEZNCMGn/UJYM7wVJmrD/nOu0O6jm8xtoP8KyM+GNUNBoxtLsLY3p+e4UMK61OTk7sv8PDuczOScW7GYmeEydgx+69Zi6ulJwvi3iX1hCHnR0RUbn1TtyKQgGT1bC1OszEy4kVfIgp3RBiucVyGzj+7GxR96zoO4/fDn5FvXU6to1bsuTwwPIv1aDqs+OsS5Q1fveKuFvz++P/2I++TJ5J45w4WnenNt9mxZQ0m6J5kUpGpj15kkZm07w2d/nDHI9QWi/M8p3EvQM9B8GOybD6c23LGrdqgL/d9thqOHFb8vOcmfy06Rn3NrKVOhVuPwbH/qbNmMfc+epHyzhPM9niTz999ll5L0H3pNCkKIrkKIM0KIaCHExLvsHyKESBJCRBa9XtZnPFL11j3Yg2eb+bBg53n+PHX1/m+oYHprKdzU+SPwagq/jILkO7uB7Jwt6f1mGM16+HH24BVWfXSwuDzGTSaOjnhO/4haP3yP2s6Oy2PHEffSS+SeMWdQiiAAABnpSURBVEwSlaomvSUFIYQaWAA8ATQEnhNCNLzLoasURQkten2jr3ikh8Pkno1o5GnHG6sjiU2p3MJ5FT7Q/G8mZrrCeWpTWD1YN85wG5VaRfMefvR+qwmKAj/PCuefddEU5t9ZJ8oqLAy/dWtxe/ddck+eIqb30yS+/z6FSUn6i10yGvpsKTQHohVFuaAoSj7wE9BLj9eTJF3hvAFNAHhn/fFKvbZeBpr/rYYP9PkGrp2CTW/AXVomHnXs6f9ecwJae3Lkj1h+mnaQhOj0O44RJiY4DhpInd+34ThoEOm/bOB8l64kf/U12txc/X4GqUrTZ1LwAuJu+z6+aNu/9RFCHBNCrBVC+OgxHukhUdPJiv+3d+fRUVV5Ase/v1SlUpV9D4EkBMISVlkitKACjbigDYq2G9Jou04fW9uZPo62x7bV8bQzPfY4Lt2C4rR227i0okCLQrfIooIGFMK+BkIIZIGQrVLrnT/eSwyQQEKqUqlwP+fk1Hbfq989SepX7913f3fenAKevX5El75vwOcptGXAVJj8CGxaCBv+1GqTKIeVKbflM+MXo/D7FIue28jqt3fhbvSe1M6SkEDGo4+Qt2QxMRMnUPH88+y9ajrVH36I8nW/SrRa8IV6oHkJkKuUGgmsAN5orZGI3CMihSJSWKEPcbV2uCgvhaykaPx+1WX1kYJ++qilSx+GvKmw7GEo3dhms+z8ZG5+fBwjJ2dRtOoQbz/1Nfu+qzht7MOWm0vWiy+S8+YbWJOTKXvkUfbNnEnNp3ow+nwTzKRQCrT85p9lPtdMKVWllHKZD18Dxra2I6XUfKVUgVKqIC0tLSjBaj3TC5/tZuZLX7C9LPiJoUtOHzW/WQTMehViM+DdudBwrM2mNruVS24axKx/G0Ok3cKyV4pY+tJmqstPH3OJGTeO3Pfepc/zz4NfUfrggxRffwN1q1fr5HCeCGZS+AYYKCL9RMQG3AwsbtlARDJbPJwBbA9iPNp5aPb4viQ4IvmXv2ygJsiF84J+9dGpmgrn1ZbBonvhLCuxZQ5I5MbHLmTiDQMo21vNwqfWs37xPjynDERLRATxV15B/yWLyfztb/GdOEHJPfdy4LY51K9br5NDDxe0pKCU8gL3A59ifNi/q5TaKiJPicgMs9kDIrJVRDYBDwC3Byse7fyUFhfFS7eOoeS4k4ffC27hvKDOU2hL1li48rewezmsfe6szS2WCEZdlsPsJ3/AgDHpFH5czF9/s46d64+gTpn0JxYLidddS96yj8n49eN4Dh7k4O23c+DW2dStWqWTQw8l4faLLSgoUIWFhaEOQwszr67exzMfb+ex6UO4+9L+QXmPmR/OZEDiAJ6bfPYP54BSCj64G7a8D3MWQf/J7d708O7jrHl3N5UldaTlxDFhVh5Z+cmttvU3NlL9/vtULViA93AZUUOGkHrvPcRNm4ZYLIHpixY0IrJBKVVwtnahHmjWtC5x1yX9mD0+hxFZCUF7jwjpoquPTiUCP/pfSB0Ef7uzuXBee/QemMSNj17IZXcMxVnn5qPnv2PJi5uoKj19FbcIu53k2bMZ8MknZD7zDKqhgdJfPMS+H82g+oNF+N3uQPZKCxF9pKCdl7w+f8AL6M1aPIucuByen/J8QPfbbhW74NUpkDEMbv+7McmtA7weH0Wfl7JhWTEup5eBY9MpmN6P5N4xrbZXPh+1n35K5bz5uHbuxJKaStKtt5B0881Yk1s/2tBCRx8paFobXvpsNz95/euAl9qOoAuvPmpN2iCY8SKUrIcVv+7w5tZIC6On5XDb0xcx5oq+FBdVsfDp9Sx/bQvHDp9eQE8sFuKnT6ffh4vIXvAa9iFDqHzhRfZM+SFlj/9aV2QNU9ZQB6BpXS0zwcGXe6t4bsUu/v3K/IDtt8uvPmrN8FlGUlj3B8geB8Ou6/Au7DGRXHRtHqMuy+a7f5RQtPIQuzeUM2BsOmMu70taTtxJ7UWE2IkTiZ04EdeePRx788+c+Ogjqt97j5iJE0m65WZiJ09GrPrjJhzo00faeenRD4pY+PVBXv1JAdOGZgRknzctvYlURyovT305IPs7Z143/OlqoxTGPZ9D6sBO7c5Z525ODh6Xj6z8JEZPyyF7aDIi0noIx45R/c47HF/4Nt7ycqwZGSRefz2JP76ByMzMVrfRgqu9p490UtDOS40eHze88iUHqhpY+vOL6ZvS+nnzjrhl6S0k2hP542V/DECEnXSiFOZdAjHpcPc/wdb5/rkaPGxde5jN/yyh/oSb5N4xjJ6Ww8ALM7BYWz8Trbxe6lat4vjb71C/di2IEDtpEkk330TMxRfrq5a6kB5T0LQzaCqcF2W1sKU0MLOdu8XpoyYJfYzCeRU7YOlDrRbO66io6EjGXN6XOc9MYOrcIQD8843tvPGrL1n30V5qj51eSE+sVuKmTiXn1fnkrVhOyt134ywqouTe+9gz9TLKn/s9rr17Ox2bFjj6SEE7rzW4vUTbAnOu+7aPbyPaGs38y+cHZH8Bseq/YOUzcPXv4cI7A7prpRQl245R9PkhirdUIUDfEakMn9SHnCHJSETrp5aU203tZys5sWgRdWvXgs+HffhwEq69lvirp2NNSgponJpBnz7StA5Yuvkwbq+fWWOyznkfP1n2E2wWG69d3o2WBfH74a83wv5V8NNPoE+r5cU6rabSyda1h9n+xWGctR7iU+3kX5TJ4B/0Ij7F0eZ23spKav7+d6o//AjX9u1gtRI7aRIJV08ndtIkImI6f9pLM+ikoGntpJTitgXrKSw+zgc/m8Cw3uc2wW3usrlYI6wsuGJBgCPspIZjMG8SoODe1RAdvDkEPq+ffd9WsHVNKaW7jDUc+gxKZPAPMskbk4bN3vZRWePOnZz4aDE1S5bgrahA7HZiL72U+Cuv0AkiAHRS0LQOqKxzcfULa7BHWlh8/8UkODo28Qvgjk/uAOD/rvy/QIfXeaUb4fUroN8kuPVdo8pqkNVUOtm5/gg71h2hpsKJ1RZB3uh0Bl6YQVZ+UtuD0z4fzo0bqfnkU2qWf4qvorI5QcRdcTmxl16KJS6u1W21tumkoGkdVFh8jJvnr+OH+enMmzO2zcst23Lnp3fi9Xt546pWlwUJvW8WGKu1TXkMJj3cZW+rlOLI3hPsWHeEPYVHcTf6iIq20u+CVPLGpJM9JPnsCWLZJ9SsWI6vohKsVqIvLCBuyhRip0zBlq3X5moPnRQ07RwsWLufp5du442fjmPSoI6t3XHX8rtw+9y8edWbQYquk5QySmxvfhfmfAB5P+zyEHwePwe3H2PvhnL2b6r4PkGMTKX/6DSy8pOJjGr9MlXl8+HctIm6lSupXbkS9x7jqiXbgDwjQUyejOOCC/QkuTbopKBp50ApxVf7qpiQl9rhbe9efjdOr5O/TP9LECILEHc9vDoV6suN8YWEcx9Y7yyfx0/J9mPs2VjO/k2VuJ1eLNYI+gxOJHdEKn2HpxCf2vYgtfvgQeo+/5zalStp+KYQvF4i4uKIHj+OmIsuImbCBGy5uR0+4uupdFLQtE7adriG1Fgb6fH2drW/d8W91LnreOvqt4IcWSdV7ob5UyA9H27/GKy2UEeEz+unbE81xUVVHNhSRfVRY1W45N4x9B2eQvbQZDL7J2C1tX4U4autpf6LL6j/4kvqv/wST6mxyKO1dyYxEyYQO2EC0ePHY01J6bI+dTc6KWhaJzS4vUx89jMGZsTx17vGt6ui6n3/uI8TjSdYeM3CLoiwk7Z+CO/NhfH3wVX/GepoTlN9tIHiokqKi6oo212N36+wWCPolZdAVn4SWflJpOfEEdHK70UphefgQeq/NBJE/br1+GtrAbD160d0wViiCwpwjC0gsk/v8+ZIQicFTeukRd8e4qF3NnHvpP48etWQs7b/2T9+RlVjFe9c804XRBcAnzxqFM674XUYfn2oo2mTu9HL4d3VHNpxnEM7jjev9WBzWOk9MJHMvAQy8xJI7xuPJbKVJOH10rhlCw2FhTR8U0jDt9/irzFmsVt79SK6oIDogrE4Ro0iasCAHjsm0d6k0DN7r2kBcN3oLAqLjzNv1T7G5iRx+bBeZ2zfrcpctMe0p6B0Ayx+ADJGGKW3uyGb3UruiFRyRxjjPA01bkp3GQmidNdxijdXAmCxRpDeN45eeQlkDkgks38C9thIxGrFMWoUjlGjSLnrLpTfj2v3biNBbCikYf16apYuBUDsduzDhuEYMQLHyBHYR44ksk+f8+ZoAvSRgqadkcvr48evfMX+yno+fuASspOj22z7889+TlldGX+b8bcujLCTag7DK5dATCrc9U+Iig11RB3WUOPmyN4TlO2tpmzvCSoO1uL3GZ9r8al20vvGk9Y3zrjNiSPKcfJ3YaUUnpISnJuLaCzabNxu24ZyuQCwJCVhHzkCx7BhRA3Ox54/mMjsbKQL5noEkj5S0LQAiLJaePnWMbz9zUF6JZx5wDmCCPyEcJGdcxHfG25YAH++DpY8aBTRC7NvxdHxNvqPTqP/aOMSYq/bR/mBmuYEcbS4hj0bypvbJ6Q7mhNESp8YUvrEEp2djS0nh4RrrgZAeTy4du/GudlIEs7Nm6hfs9YoGwJEREcTNWgQUfmDsefnEzV4MPZBg3rErGt9pKBpHVDn8hIb1fp3qYdWPkRxTTGLZi7q4qgCYPV/w2dPw/T/hnF3hzqagHPWuak4UEv5wVrj9kANdcddza/bYyJJ7m0kiKZEkZwZg63FUYXf6cS1Zw+NO3bg2rGTxp07cO3c1TyIjQiRWVnY+vcjqn+ecZuXh61fv25R5E8fKWhagB063sCNr3zFg5cN5KYLc057XURCuxxnZ1z8r3DoG2PwufdoyDrrZ0dYccTayBmWQs6w7y9Jdda5OVZaT9XhOqpK66kqrWPHV2V4XL7mNjGJUSRmOEjMiCEx3UFiRiaJk/JIn3U9ERZjDMl7+DCNO3fSuGMH7j17cO3bT8O69c2nnwAsyclGkujXH1v//tj65hgJJDubCEfbczFCQScFTWunzAQHeemxPP7RVob1TmB4n5ML50VIiNdo7oyICLjuFZh3Kbw715jYFtOzr+l3xNroM9hGn8Hff4tXfkXtsUaqDhtJovpoA9VHG9hTeBRXg7e5XYRFSEhzkJAeTXyqnfiUgcRNGEH8DAdpKXYibYKnrAz33r249u3Hvc+4rV2xAl919UlxWNJSsWXnYMvOIvKUW0tKSpePXejTR5rWAVV1Lq5+YS02awRL7r+YhOjvC+c9vOphth3bxtLrloYwwk46/C0suBxyL4HZ70GEXhkNjMHoxnoP1UedVB+tN28bqC5voKbSidd98peBqBgr8SkO4lLsxKfYiUtxEJsURUxiFHZpxHq8DG/pITwlJbhLSvAcLMF96BDeI0dOWhBJIiOxZmQQ2asX1sxM87YXkb0yiczshbVXLyyJie26OkqfPtK0IEiJjeLl2WO4ad5X/Nt73zF/TgER5mIyYX36qEnv0XDVf8HSX8Dq38HkR0IdUbcgIjhibThibWTmnXyEqJSisc5DTVUjNZVOaqsaqalqpLbKyfGyeg5sqcLnOfnvQiKE6PhEYhIziM2eSMxwGzFJUUTHWIjy1BJZV0FE1WEslaX4jhzBc+QIzg0bqCkvB6/35H05HESmp2NJS8WaloY1Nc28NR+bz7eXTgqa1kFj+ybxq+lDWLmzHKfHR4w58BzWp49aGns7lKyHz581xhYGXBbqiLo1EcERZ8MRZyMjN/6015Vf0VDrpr7aRd1xFw0nXNRVu6g3f44fbeDQzuO4nd5TtswAycAeE4ljkI3osZHYYyOxW31EKSeR7joincewnKhAnSgnouoInu278VeswV9ff8790UlB087BHRNzmTshF0uLJSfDbvJaW0SM5TvLNsP7dxvjC4m6PPW5kgghJiGKmIQo0vu23c7j8jUnCmedB2etm4ZaN85a476z1k1VaT3OWrc5vmEB0syfoRADxIB1sAW7w0JUFNgsfiJxE+lzwlMz2hWvTgqadg5EBIvA0ZpGnvhoK0/OHIYg4TdPoS22aLjxTZg/Gd67He5Y1i0K5/VkkVEWEjOiScxoe4JkE5/X35wsGus9NNZ7cNV7aKz30tjw/X1Xg4fa+igane0r6ghBTgoiciXwvxgp7TWl1LOnvB4FvAmMBaqAm5RSxcGMSdMC6YTTw6pdFfz8r98yaLj0jCOFJqkD4No/wLtzYPljMP13oY5IM1msEcQmRRGbFNXube5s568vaNc6iYgFeBm4ChgK3CIiQ09pdidwXCk1APgfoPuVa9S0MxiUEcez14/g6+JjbCmt6VlJAWDoDLjofvh6PhSFUfkO7ZwF80hhHLBHKbUPQETeBmYC21q0mQn8xrz/N+AlERHV4/6ztJ5s5qg+bDhwnHf212NLKmf8W+MBcPv8eHwn/ykLEG2uCeDy+vH6O/Z6BOAwX2/0+vGd+rqAI9J83ePjlLfHImA3X3d6fPjb8bqgsPfNIaLwCSh8wowSoK1/0578estLP8/0eneMvX2CmRT6ACUtHh8CxrfVRinlFZETQApQ2bKRiNwD3GM+dInIlqBE3D2kckr/exjdv/DVk/sGPb9/g9vTKCwGmpVS84H5ACJS2J4JGOFK9y+89eT+9eS+wfnRv/a0C+b86VKg5XVsWeZzrbYRESuQgDHgrGmapoVAMJPCN8BAEeknIjbgZmDxKW0WA3PN+zcAn+nxBE3TtNAJ2ukjc4zgfuBTjEtSX1dKbRWRp4BCpdRiYAHwZxHZAxzDSBxnMz9YMXcTun/hrSf3ryf3DXT/gDAsiKdpmqYFT3itJ6dpmqYFlU4KmqZpWrOwTAoi8rSIbBaR70RkuYj0DnVMgSQivxORHWYfF4lIYqhjCiQR+bGIbBURv4j0iEsAReRKEdkpIntEpEfVmxaR10WkvKfODxKRbBFZKSLbzL/LB0MdUyCJiF1EvhaRTWb/njxj+3AcUxCReKVUjXn/AWCoUuq+EIcVMCJyOcaVWF4R+U8ApdS/hzisgBGRIYAfmAf8UikV1qsmmSVddgHTMCZpfgPcopTadsYNw4SIXArUAW8qpYaHOp5AE5FMIFMptVFE4oANwLU96PcnQIxSqk5EIoG1wINKqXWttQ/LI4WmhGCKoTNzurshpdRypVRTcfV1GHM8egyl1Hal1M5QxxFAzSVdlFJuoKmkS4+glFqNcXVgj6SUKlNKbTTv1wLbMaot9AjKUGc+jDR/2vzMDMukACAiz4hICTAb+HWo4wminwLLQh2EdkatlXTpMR8q5xMRyQVGA+tDG0lgiYhFRL4DyoEVSqk2+9dtk4KI/ENEtrTyMxNAKfWYUiobeAu4P7TRdtzZ+me2eQzwYvQxrLSnf5rWnYhILPA+8ItTzkaEPaWUTyk1CuOswzgRafM0YLetfaSUau8agG8BHwNPBDGcgDtb/0TkduAaYGo4zvLuwO+vJ2hPSRetGzPPtb8PvKWU+iDU8QSLUqpaRFYCVwKtXjjQbY8UzkREBrZ4OBPYEapYgsFcnOhhYIZSqiHU8Whn1Z6SLlo3ZQ7ELgC2K6V+H+p4Ak1E0pquYBQRB8YFEW1+Zobr1UfvY5SB9QMHgPuUUj3mm5lZ9iOK74sDruthV1ddB7yIsbhsNfCdUuqK0EbVOSIyHXie70u6PBPikAJGRBYCkzFKSx8FnlBKLQhpUAEkIhcDa4AiaF5P9VdKqY9DF1XgiMhI4A2Mv80I4F2l1FNttg/HpKBpmqYFR1iePtI0TdOCQycFTdM0rZlOCpqmaVoznRQ0TdO0ZjopaJqmac10UtDCjog8ICLbRSRgM71FJFdEbm3xuEBEXgjU/ruCiDwlIufTpEEtCPQlqVrYEZEdwGVKqUMB3OdkjIqt1wRqn4EmItYWhRI1LSj0kYIWVkTkFaA/sExEHhKR34jIL1u8vsX81p9rHk28ataQX27O5kREBpi1mTaJyEYRyQOeBS4x1+h4SEQmi8hSs32yiHxorm+xzpwMhPner4vI5yKyzyzj3lrMdWKskbHVfN9xLbaZYbbJFZE1ZjwbRWSC+fxk8/nFwDbzucfFWLthrYgsbOq/iPxJRG4w7xeLyJPmvopEJD8ovxCtx9FJQQsr5szuw8AUpdT/nKX5QOBlpdQwjJnT15vPv2U+fwEwASgDHgHWKKVGtbLfJ4FvlVIjgV8Bb7Z4LR+4AqN89hNmDZ1TxWCsjzEMqAX+A6PUwHVA08zScmCaUmoMcBPQ8tTVGIz694NE5EKzHxcAVwFnWqSo0tzfH4FfnqGdpjXrtgXxNC0A9iulvjPvbwByzUVU+iilFgEopRoBjPI3bboYM6EopT4TkRQRiTdf+7tSygW4RKQcyMAond2SG/jEvF8EuJRSHhEpAnLN5yOBl0RkFOADBrXY/mul1H7z/kTgIzPuRhFZcoa4mwq7bQBmnamDmtZEJwUt3Hk5+YjX3uK+q8V9H+AIwvuf+h6t/U95WlS69Tdto5Tyi0hT+4cw6gpdgNGfxhbb13cytrbi0rTT6NNHWrgrxji9goiMAfqdqbG5stYhEbnW3CZKRKIxTuvEtbHZGozFnJoGpCuDUG8/AShTSvmBORjFy1rzBfAjMdbdjcUor65pAaOTghbu3geSRWQrxmJLu9qxzRzgARHZDHwJ9AI2Az5z8PmhU9r/Bhhrtn8WmBuo4Fv4AzBXRDZhjFO0enSglPoGoyz3ZowV+YqAE0GIRztP6UtSNS3MiEisuQh7NLAauKdpjWFN6yx9nlHTws98ERmKMX7yhk4IWiDpIwVN0zStmR5T0DRN05rppKBpmqY100lB0zRNa6aTgqZpmtZMJwVN0zSt2f8DBk43UawISXIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "x = np.linspace(-3,3,601)\n",
    "# perceptron loss\n",
    "y1 = list(map(lambda x: max(0, -x), x))\n",
    "# hinge loss\n",
    "y2 = list(map(lambda x: max(0,1-x), x))\n",
    "# 0-1 loss\n",
    "y3 = list(map(lambda x:1 if x <= 0 else 0, x))\n",
    "# lr loss\n",
    "y4 = list(map(lambda x:np.log2(1+np.exp(-x)), x))\n",
    "# adaboost\n",
    "y5 = list(map(lambda x:np.exp(-x), x))\n",
    "plt.plot(x,y1,'--',label='perceptron loss')\n",
    "plt.plot(x,y2, '-', label='hinge loss' )\n",
    "plt.plot(x,y3, '-', label='0-1 loss')\n",
    "plt.plot(x,y4, '-', label='lr')\n",
    "plt.plot(x,y5, '-', label='adaboost')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlim(-3,3)\n",
    "plt.ylim(0,3)\n",
    "plt.xlabel(\"function margin\")\n",
    "plt.ylabel(\"loss\")\n",
    "# plt.savefig(\"test.png\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:anaconda3]",
   "language": "python",
   "name": "conda-env-anaconda3-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
